PHP多线程
发布时间2022-12-29 21:15:28【PHP】11人已围观
简介 PHP默认是单线程,php如何实现多线程?
PHP多线程
PHP默认是单线程
如果需要实现多线程最早可使用 pthreads拓展 进行编写。但是只能用于CLI模式。
*警告*:不可以在 web 服务器环境中使用 pthreads 扩展, PHP 多线程开发仅限于命令行模式的应用。
原因众所周知,CGI模式下PHP是基于PHP-FPM多进程的并发模型。想要使用多线程到CGI,得自己写一套基于多线程的HTTP 并发服务。
而且此拓展已经不再维护,官方推荐使用 parallel拓展 进行代替。不过,parallel 仅支持PHP 7.2+ 版本。
还有一种使用curl_multi_init
/**
* https 发起post多发请求
* @param array $nodes url和参数信息。
* $nodes = [
* [0] = > [
* 'url' => 'http://******',
* 'data' => '{"a":1,"b":2}'
* ],
* [1] = > [
* 'url' => 'http://******',
* 'data' => null
* ]
* ....
* ];
* @param int $timeOut 超时设置
* @return 请求链接返回的数据,array数组
*/
public static function postMulti($nodes, $timeOut = 5){
try {
if (false == is_array($nodes)) {
return [];
}
$mh = curl_multi_init();
$curlArray = array();
foreach ($nodes as $key => $info) {
if (false == is_array($info)) {
continue;
}
if (false == isset($info['url'])) {
continue;
}
$ch = curl_init();
// 设置url
$url = $info['url'];
curl_setopt($ch, CURLOPT_URL, $url);
$data = isset($info['data']) ? $info['data'] : null;
if (false == empty($data)) {
curl_setopt($ch, CURLOPT_POST, 1);
// array
if (is_array($data) && count($data) > 0) {
curl_setopt($ch, CURLOPT_POST, count($data));
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// 如果成功只将结果返回,不自动输出返回的内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// user-agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
// 超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut);
$curlArray[$key] = $ch;
curl_multi_add_handle($mh, $curlArray[$key]);
}
$running = NULL;
do {
usleep(10000);
curl_multi_exec($mh, $running);
} while ($running > 0);
$res = [];
foreach ($nodes as $key => $info) {
$res[$key] = curl_multi_getcontent($curlArray[$key]);
}
foreach ($nodes as $key => $info) {
curl_multi_remove_handle($mh, $curlArray[$key]);
}
curl_multi_close($mh);
return $res;
} catch (Exception $e) {
return [];
}
}赞一个! (2)
上一篇:PHP的多继承实现
下一篇:多进程和多线程有什么区别?
相关文章
文章评论