日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php 代码线程,php实现多线程代码

發(fā)布時(shí)間:2025/3/20 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 代码线程,php实现多线程代码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章給大家分享的內(nèi)容是關(guān)于php實(shí)現(xiàn)多線程代碼,有著一定的參考價(jià)值,有需要的朋友可以參考一下

PHP本身是不支持多線程的,我們可以通過(guò)php自身函數(shù)虛擬處理啊多線程。下面介紹三個(gè)函數(shù)來(lái)實(shí)現(xiàn)多進(jìn)程。

一、fsockopen,打開(kāi)一個(gè)網(wǎng)絡(luò)連接或者一個(gè)Unix套接字連接。其中stream_set_blocking() - 為資源流設(shè)置阻塞或者阻塞模式

* @title: PHP多線程類(lèi)(Thread)

* @version: 1.0

*

* PHP多線程應(yīng)用示例:

* require_once 'thread.class.php';

* $thread = new thread();

* $thread->addthread('action_log','a');

* $thread->addthread('action_log','b');

* $thread->addthread('action_log','c');

* $thread->runthread();

*

* function action_log($info) {

* $log = 'log/' . microtime() . '.log';

* $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";

* $fp = fopen($log, 'w');

* fwrite($fp, $txt);

* fclose($fp);

* }

*/

class thread {

var $hooks = array();

var $args = array();

function thread() {

}

function addthread($func)

{

$args = array_slice(func_get_args(), 1);

$this->hooks[] = $func;

$this->args[] = $args;

return true;

}

function runthread()

{

if(isset($_GET['flag']))

{

$flag = intval($_GET['flag']);

}

if($flag || $flag === 0)

{

call_user_func_array($this->hooks[$flag], $this->args[$flag]);

}

else

{

for($i = 0, $size = count($this->hooks); $i < $size; $i++)

{

$fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']);

stream_set_blocking($fp,0);

if($fp)

{

$out = "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn";

$out .= "Host: {$_SERVER['HTTP_HOST']}rn";

$out .= "Connection: Closernrn";

fputs($fp,$out);

fclose($fp);

}

}

}

}

}

二、stream_socket_client,PHP5中可以使用新增的stream_socket_client()函數(shù)直接替換掉fsocketopen()。其中stream_set_blocking() - 為資源流設(shè)置阻塞或者阻塞模式

$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);

stream_set_blocking($fp,0);

if (!$fp) {

echo "$errstr ($errno)
\n";

} else {

fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");

while (!feof($fp)) {

echo fgets($fp, 1024);

}

fclose($fp);

}

?>

三、curl_multi,當(dāng)需要多線程的時(shí)候,可以用curl_multi一次性請(qǐng)求多個(gè)操作來(lái)完成,但curl走的是網(wǎng)絡(luò)通信,效率與可靠性就比較差了的。

function sendMulitRequest($send_data){

$params = array();

$curl = $text = array();

$handle = curl_multi_init();

foreach ($data as $k => $v) {

if (empty($v['url'])) {

$v['url'] = "http://www.xxx.com"; //if url is empty,set defalut url

}

$reqBody = json_encode($v['body']);

$reqStream = array(

'body' => $reqBody,

);

$encRequest = base64_encode(json_encode($reqStream));

$params['data'] = $encRequest;

$curl[$k] = curl_init();

curl_setopt($curl[$k], CURLOPT_URL, $v['url']);

curl_setopt($curl[$k], CURLOPT_POST, TRUE);

curl_setopt($curl[$k], CURLOPT_HEADER, 0);

curl_setopt($curl[$k], CURLOPT_POSTFIELDS, http_build_query($params));

curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);

curl_multi_add_handle($handle, $curl[$k]);

}

$active = null;

do {

$mrc = curl_multi_exec($handle, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {

if (curl_multi_select($handle) != -1) {

do {

$mrc = curl_multi_exec($handle, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

foreach ($curl as $k => $v) {

if (curl_error($curl[$k]) == "") {

$text[$k] = (string) curl_multi_getcontent($curl[$k]);

}

curl_multi_remove_handle($handle, $curl[$k]);

curl_close($curl[$k]);

}

curl_multi_close($handle);

return $text;

}

相關(guān)推薦:

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的php 代码线程,php实现多线程代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。