php怎么开启多线程_php多线程实现方式与PHP环境下的替代方案

说实话,当我第一次接触PHP多线程时,我很困惑。
当时公司接到一个高度并行的调度任务,CPU利用率提升到9 0%,就想着如何优化。
起初我其实也遵循了这个趋势,使用了 pthreads 扩展,但是它在 Apache 环境中就崩溃了。
经过两天的调试才发现问题出在线程安全版本上——教训太深刻了。

有趣的是,并行扩展解决了我的燃眉之急。
我记得我是在 PHP 7 .3 上安装的。
编译过程花了很长时间,最后我只是将 Extension=parallel.so 行添加到 php.ini 中。
他们的文档明确指出它适合 CPU 密集型任务,例如我的计算密集型数据处理场景。
使用Future模式编写代码特别优雅,例如:
php $future = 并行运行(function() { // 模拟劳动密集型操作 睡眠(2 ); return“计算结果”; }); echo '主线程先做其他事情'; $结果 = $未来->值(); // 这将阻塞等待结果 echo "最终结果:{$result}";
不过,项目重组后,我建议团队使用Swoole。
当时我主要认为Swole的协程模型更适合Web环境,可以直接运行在Nginx上。
不要忘记编写一个协程来查询这两个 API。
代码量是并行运行的一半,性能测试的事务吞吐量远高于直接并行运行多个线程。
大概,这个结论是经过各种方案的思考——具体场景的详细分析之后得出的。

例如,对于我们内部开发的日志分析平台,使用 pcntl_fork() 在单独的进程中运行它是合适的。
创建一个子进程来处理每条日志,父进程收集结果。
在这种场景下,消息队列其实就有点麻烦了。
代码大概是这样写的:
php $pids = []; 为 ($i = 0; $i < 1 xss=clean xss=clean> 0) { $pids[] = $pid; } } //父进程等待所有子进程 foreach ($pids 为 $pid) { pcntl_wait($状态); } echo '所有子进程已终止';
至于ReactPHP,我个人用得不多。
我相信他们的家更适合需要处理大量网络连接的场景,比如设置代理什么的。
读完文档,我很头疼。
无论如何,我们项目的需求并没有那么复杂,所以我们暂时把它们放在一边。

粗略地说,选择哪种解决方案并没有绝对的标准。
Parallel适合临时快速并行实现,pcntl_fork适合简单稳定的多进程,Swoole和ReactPHP更适合长期维护和业务复杂的情况。
我选择Swoole主要是因为它的事件驱动模型,可以直接替代curl阻塞操作,并且代码占用少。
但最尴尬的是pthreads。
用过的人都知道。

ThinkPHP6中使用simps/mqtt连接MQTT服务器时如何解决“async-io must be used in PHP CLI mode”错误?

我上周试过这个。

该项目将于 2 02 3 年启动。

我的朋友明白了。

这个错误非常烦人。

主要原因是在Swoole中。

协程只能在 CLI 模式下使用。

ThinkPHP 默认为 FPM。

不兼容。

解决方案是运动。

1 .制作一个独立的命令。

首先运行 php make:command MqttConnect
然后更改 app/command/MqttConnect.php。

输入:
php 受保护函数设置() { $this->setName('mqtt:connect')->setDescription('连接到 MQTT 服务器'); }
受保护的函数执行(输入$输入,输出$输出) { $配置= [ '主机' => 'your_mqtt_host', '港口' => 1 8 8 3 , 'client_id' => 'simps_php_client', '用户名' => '用户名', '密码' => '密码', ];
$client = 新客户端 ($config);
if ($client->connect()) { $output->writeln('成功连接MQTT服务器。
'); $client->订阅(['主题/测试' => 0]); $客户端->循环(); } 否则{ $output->writeln('连接 MQTT 服务器失败。
'); }
然后在app/command.php中添加这句话:
php 回来[ 'appcommandMqttConnect', ];
上次执行:
php 我认为 mqtt:connect
2 .或者直接编写脚本。

创建mqtt_connect.php:
php <?php 需要 __DIR__ 。
'/vendor/autoload.php';
使用 Simps\MQTTClient;
$config = [ '主机' => 'your_mqtt_host', '港口' => 1 8 8 3 , 'client_id' => 'simps_php_cli', ];
$client = new Client($config);
if ($client->connect()) { echo "已连接到 MQTT 服务器。
\n"; $客户端->循环(); } 否则{ echo "连接失败。
\n";
然后运行:
php mqtt_connect.php
注意:
1 服务器必须安装Swoole并且版本必须>=4 .5
2 使用 php -m | swoole 钩子来检查。

3 MQTT 必须使用loop() 来维持连接。

就是这样。

不太复杂。

这取决于你。

如何查看当前PHP环境信息 PHP版本和模块查询命令

嘿兄弟,我最近在做一个PHP项目,需要检查一下环境信息。
我想起了之前遇到的坑,和大家分享一下。

我记得2 01 9 年的一次,当时我在一家小公司做一个项目。
这时候我需要检查PHP的版本和模块,所以我直接在终端输入php -v。
很多信息都出来了,包括PHP7 .4 .3 ,还显示了编译时间。
我很高兴,至少我知道正在使用哪个版本。

然后想看看加载了哪些模块,于是又输入php -m 出来了一堆模块,比如Curl、GD、MySQL等等,心里舒服多了。

有一次我需要找到配置文件的路径,于是我尝试了php --ini,然后屏幕上弹出了很多信息。
最后找到配置文件路径,记住了/etc/php/7 .4 /cli/php.ini。

后来我想获取PHP文件的信息,所以写了一个info.php,内容为<?php phpinfo(); ?> 然后上传到服务器。
当我访问它时,页面显示了我需要的所有信息,包括版本、编译选项、加载的模块以及环境变量和运行时参数。
这东西真的很实用。

还有一次,在没有 SSH 权限的情况下,我通过 FTP 上传了 info.php 文件,并按照前面的步骤访问了它。
结果发现 phpinfo() 被禁用了,所以我知道我必须联系服务器管理员。
后来他们给了我一个调试面板,比如 Laravel 的 /debug 路径,这解决了问题。

我还注意到有时CLI和Web模式下的PHP版本和配置文件是不同的,所以我必须小心。
默认情况下,CLI 模式加载 /etc/php/{version}/cli/php.ini,而 Web 模式(例如 FPM)加载 /etc/php/{version}/fpm/php.ini。
因此,在查看phpinfo()时,优先考虑显示的信息。

出于安全原因,我永远不会在生产环境中启用 phpinfo()。
这东西太危险了,可能会泄露机密信息。
我通常使用命令行工具或者框架提供的调试功能来获取信息。

综上所述,检查PHP环境信息最常用的方法是php -v和php -m。
要进行全面分析,请使用 phpinfo()。
特殊情况,需要结合文件上传和配置文件验证或者向管理员寻求帮助。
希望这些经验可以帮助到你!