• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php如何处理并行的两个线程?

php 搞代码 4年前 (2022-01-26) 44次浏览 已收录 0个评论
文章目录[隐藏]

1.用户上传一张图片到A服务器的receive.php,
2.在A服务器的receive.php接收到这个图片后,会向B服务器通过curl post这张图片,
(由于图片非常大,因此,A服务器向B服务器传输图片非常耗时)
在这个耗时长久过程中,如果我再向A服务器的receive.php发送一个请求request2,但是由于这个receive.php还正在向B服务器传输图片,因此这个请求一直要等待,直到A服务器将这个图片完全发送完毕为止,才回来处理第二个请求request2。


问题:现在怎样打破这种队列效应,让A服务器的receive.php同时处理两个请求?
即使不能实现php多线程处理,那么如何能让request2做到伪请求,我的意思是,假设request2请求receive.php后,receive.php要查询大量数据库,最后echo “request done”,现在我只需要输出echo “request done”即可,其余receive.php该搞啥就搞啥

回复内容:

1.用户上传一张图片到A服务器的receive.php,
2.在A服务器的receive.php接收到这个图片后,会向B服务器通过curl post这张图片,
(由于图片非常大,因此,A服务器向B服务器传输图片非常耗时)
在这个耗时长久过程中,如果我再向A服务器的receive.php发送一个请求request2,但是由于这个receive.php还正在向B服务器传输图片,因此这个请求一直要等待,直到A服务器将这个图片完全发送完毕为止,才回来处理第二个请求request2。


问题:现在怎样打破这种队列效应,让A服务器的receive.php同时处理两个请求?
即使不能实现php多线程处理,那么如何能让request2做到伪请求,我的意思是,假设request2请求receive.php后,receive.php要查询大量数据库,最后echo “request done”,现在我只需要输出echo “request done”即可,其余receive.php该搞啥就搞啥

觉得你需要一个消息队列。

除此之外,可以:

<code>以是转载。PHP语言本身是不支持多线程的. 总结了一下网上关于PHP模拟多线程的方法, 总的来说, 都是利用了PHP的好伙伴们本身所具有的多线程能力. PHP的好伙伴指的就是LINUX和APACHE啦, LAMP嘛.另外, 既然是模拟的, 就不是真正的多线程. 其实只是多进程. 进程和线程是两个不同的概念. 好了, 以下方法都是从网上找来的.1. 利用LINUX操作系统<?phpfor ($i=0;$i上面存成test.php, 然后<p>+本文来源gao!%daima.com搞$代*!码9网(</p><strong>搞gaodaima代码</strong>写一段SHELL代码#!/bin/bashfor i in 1 2 3 4 5 6 7 8 9 10dophp -q test.php &done2. 利用fork子进程(其实同样是利用LINUX操作系统)<?phpdeclare(ticks=1);$bWaitFlag = FALSE; /// 是否等待进程结束$intNum = 10; /// 进程总数$pids = array(); /// 进程PID数组echo ("Startn");for($i = 0; $i < $intNum; $i++) {$pids[$i] = pcntl_fork();/// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息if(!$pids[$i]) {// 子进程进程代码段_Start$str="";sleep(5+$i);for ($j=0;$j " . time() . " $str n";exit();// 子进程进程代码段_End}}if ($bWaitFlag){for($i = 0; $i  " . time() . "n";}}echo ("Endn");?>3. 利用WEB SERVER, PHP不支持多线程, APACHE可是支持的, 呵呵.假设我们现在运行的是a.php这个文档. 但是我在程式中又请求WEB服务器运行另一个b.php那么这两个文档将是同时执行的.<?phpfunction runThread(){$fp = fsockopen('localhost', 80, $errno, $errmsg);fputs($fp, "GET /a.php?act=brnrn");fclose($fp);}function a(){$fp = fopen('result_a.log', 'w');fputs($fp, 'Set in ' . Date('h:i:s', time()) . (dou ble)microtime() . "rn");fclose($fp);}function b(){$fp = fopen('result_b.log', 'w');fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");fclose($fp);}if(!isset($_GET['act'])) $_GET['act'] = 'a';if($_GET['act'] == 'a'){runThread();a();}else if($_GET['act'] == 'b') b();?>当然啦,也可以把需要多线程处理的部分交给JAVA去处理, 然后在PHP里调用, 哈哈.<?phpsystem('java multiThread.java');?></code>

pthreads扩展可以实现真正的多线程,我前阵子做苹果的推送服务有用到,不过有很多坑。
耗时任务可以考虑异步,丢到消息队列中处理。

不知楼主的 HTTP 服务器用的是什么,怎么会有这种奇怪的“队列效应”?
难道说楼主限制了 HTTP 服务器的并发请求数,同一时间只允许一个请求?


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php如何处理并行的两个线程?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址