|3分钟短文 | PHP多线程没用过,你可能错过了计算机最好的时代!

文章图片

文章图片

引言
别的语言都在一窝蜂地搞编译 , 搞虚拟机 , 搞多线程 , 提高效率 。 我们整天敲 PHP 代码 , 除了 Nginx 调用 php-fpm 拉取 PHP 文件的解析外 , 对于多线程有多少了解?
请问 , PHP 能不能使用多线程?如果能 , 怎么实现的?
本文就带你打开这个疑问 。
学习时间
这个问题的答案是肯定的 , PHP 可以使用多线程 。 我们借助于 pthreads 实现:
该项目提供了与基于Posix Threads的PHP兼容的多线程 。有啥亮点没?下面这些全是:
- 一个易于使用 , 快速学习的面向对象的PHP 7.2线程API
- 执行所有预定义和用户声明的方法和函数 , 包括闭包 。
- 包括现成的同步
- 无限的可能性...
还有一些注意事项:
pthreads是一个面向对象的API , 它提供了PHP中多线程所需的所有工具 。PHP应用程序可以创建 , 读取 , 写入 , 执行并与线程 , 辅助对象和线程对象同步 。
警告:pthreads扩展名不能在Web服务器环境中使用 。因此 , PHP中的线程应仅保留给基于CLI的应用程序使用 。命令行应用脚本完全适用 , 这也与我们编写 Bash , Python等等类似 。 下面举一个例子:
然后执行一次:
【|3分钟短文 | PHP多线程没用过,你可能错过了计算机最好的时代!】再执行一次:
实际运用
上面的代码是个示例性质的应用 , 仅仅是为了展示多线程运行 。 下面来一段业务代码 。
该类模拟一个url请求 。 因为网络问题 , 有可能失败 , 或者不确定返回时间 , 所以适合并行 。 接着我们使用该类进行多网络请求并发 。 为了减轻系统负荷 , 使用微秒延时 。
$t = microtime(true);
$g = new AsyncWebRequest(sprintf(\"http://www.google.com/?q=%s\" rand() * 10));
实例化之后 , 我们发起请求:
if ($g->start()) {
printf(\"Request took %f seconds to start \" microtime(true) - $t);
while ( $g->isRunning() ) {
echo \".\";
usleep(100);
if ($g->join()) {
printf(\" and %f seconds to finish receiving %d bytes\\" microtime(true) - $t strlen($g->data));
else
printf(\" and %f seconds to finish request failed\\" microtime(true) - $t);
其他方案
如果不用 pthreads 库提供的能力 , 该怎么写并行的多任务呢?其实 PHP 提供了一个 popen 函数 , 用于打开进程文件指针 。
popen 返回一个和 fopen 所返回的相同的文件指针 , 只不过它是单向的(只能用于读或写)并且必须用 pclose 来关闭 。 此指针可以用于 fgets , fgetss 和 fwrite 。 当模式为 'r' , 返回的文件指针等于命令的 STDOUT , 当模式为 'w' , 返回的文件指针等于命令的 STDIN 。
直接上代码:
for ($i=0; $i<10; $i++) {
// 打开10个进程
for ($j=0; $j<10; $j++) {
$pipe[$j
= popen('script2.php' 'w');
// 等待完成
for ($j=0; $j<10; ++$j) {
pclose($pipe[$j
);
大家看到了实现的方法与 pthreads 完全不同 , 这段代码仍然是阻塞运行 , 只不过同时打开10个进程 , 并行运行 。
并行与多线程完全不同 。 不过 , 可视作一个简单的解决方案吧 。
写在最后
经过上述两种实现方法 , 大家应该对于多线程 , 多进程 , 并行这些概念有一些认识了 。
Happy coding :_)
我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。
推荐阅读
- 大米嘚啵嘚历史短文|世人皆知“负荆请罪”,却不知长平之战后,蔺相如、廉颇的下场
- 曾经把钱输光的他,3分钟写的写的一首歌,一值的销量都无人打破
- 3分钟学会科目三灯光操作,成都驾考课堂考试口诀
- 科学探索|德国曾经制造出飞碟,3分钟升到千米高空?德国投降后飞碟去哪了
- 摆摆鲸鱼君|八字短文案 漫漫星河 温暖人间
- 小玲美食记|发面饼怎样才蓬松柔软,不擀面不揉面,筷子一搅,3分钟就能出锅
- 出场3分钟送助攻!郑智接班人踢疯了,保利尼奥附体效率完胜何超
- 痛心的“巧合”!男子醉酒躺路上,3分钟后一醉酒司机开车经过…
- 江苏新闻|痛心的“巧合”!男子醉酒躺路上,3分钟后一醉酒司机开车经过…
- 杭州6岁男童1对1游泳课溺水3分钟,场内4名救生员无人发现救援,最近一名距离出事地点不到3米
