導航:首頁 > 編程語言 > php線程

php線程

發布時間:2022-02-02 14:29:52

php支持多線程嗎

PHP語言本身是不支持多線程的。網上關於PHP模擬多線程的方法,都是利用了LINUX和APACHE等本身所具有的多線程能力。既然是模擬的,就不是真正的多線程,其實只是多進程。
1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(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<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function 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()) . (double)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里調用。

<?php
system('java multiThread.java');
?>

⑵ php多線程

以下都是轉載, 簡單說下, php是不支持多線程的。。。。

PHP語言本身是不支持多線程的. 總結了一下網上關於PHP模擬多線程的方法, 總的來說, 都是利用了PHP的好夥伴們本身所具有的多線程能力. PHP的好夥伴指的就是LINUX和APACHE啦, LAMP嘛.

另外, 既然是模擬的, 就不是真正的多線程. 其實只是多進程. 進程和線程是兩個不同的概念. 好了, 以下方法都是從網上找來的.

1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(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<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function 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()) . (double)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里調用, 哈哈.

<?php
system('java multiThread.java');
?>

⑶ 有什麼辦法可以實現php控制多線程運行

php(做為現在的主流開發語言)中實現多線程? 看到這個標題, 你一定以為我瘋了..但是事實上我真的這么做了.
下面是我的一些做法, 已經實驗過. 確實可以的.
我們知道php(做為現在的主流開發語言)本身是不支持多線程的, 但是我們的WEB伺服器是支持多線程的.
也就是說可以同時讓多人一起訪問. 這也是我在php(做為現在的主流開發語言)中實現多線程的基礎.
假設我們現在運行的是a.php(做為現在的主流開發語言)這個文件. 但是我在程序中又請求WEB伺服器運行另一個b.php(做為現在的主流開發語言)
那麼這兩個文件將是同時執行的.
(PS: 一個鏈接請求發送之後, WEB伺服器就會執行它, 而不管客戶端是否已經退出)
有些時候, 我們想運行的不是另一個文件, 而是本文件中的一部分代碼.該怎麼辦呢?
其實可是通過參數來控制a.php(做為現在的主流開發語言)來運行哪一段程序.
下面看一個例子:
//a.php(做為現在的主流開發語言)

php(做為現在的主流開發語言)代碼:--------------------------------------------------------------------------------
<?php(做為現在的主流開發語言)
function runThread()
{
$fp = fsockopen(localhost, 80, $errno, $errmsg);

fputs($fp, "GET /a.php(做為現在的主流開發語言)?act=b "); //這里的第二個參數是HTTP協議中規定的請求頭
//不明白的請看RFC中的定義

fclose($fp);
}
function a()
{
$fp = fopen(result_a.log, w);
fputs($fp, Set in . Date(h:i:s, time()) . (double)microtime() . " ");

fclose($fp);
}
function b()
{
$fp = fopen(result_b.log, w);
fputs($fp, Set in . Date(h:i:s, time()) . (double)microtime() . " ");

⑷ php多線程問題

header('location:http://xxxx');每次執行完畢,用這個定向一下唄

⑸ php中怎麼實現多線程

php 是不支持多線程的,可以利用APACHE實現,以下是網上找到的代碼

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function 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()) . (double)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();
?>

⑹ php7有沒有多線程

安裝PHP7
以下所有命令在root用戶下執行
下載PHP7,目前最新版本是7.0.3,根據情況自行選擇版本,PHP5.4以後的各版本也是支持的。
wget http://ar2.php.net/get/php-7.0.3.tar.gz/from/this/mirror -O php.tar.gz
tar xvfz php.tar.gz
cd php

編譯安裝。
選項自行選擇,可以讓PHP多版本共存。但maintainer-zts是必須的,如果只做爬蟲,除了curl,其它擴展基本不用安裝。遇到無法安裝的自行查找解決,例如我安裝的時候遇到iconv沒有找到,那直接就without了。
./configure --prefix=/usr/local/php7 --without-iconv --enable-maintainer-zts --with-curl
make
make install

安裝完成
然後開始安裝pthreads。用pecl安裝是超級簡單的。
cd /usr/local/php7/bin
./pecl install pthreads

安裝完成
配置文件
在/usr/local/php7/lib/目錄下新建php.ini文件,初始文件可在php源碼的根目錄找到php.ini-proction
然後編輯php.ini,在末尾增加
extension="pthreads.so"

安裝完成
查看安裝是否成功
運行
/usr/local/php7/bin/php -m

查看模塊支持列表,如果有pthreads存在則說明環境創建成功。
或者編輯文件test.php
<?php
$thread = new class extends Thread {
public function run() {
echo "Hello World\n";
}
};
$thread->start() && $thread->join();
?>

成功輸出Hello World說明成功。

⑺ php怎樣多線程操作

其實就PHP而言,可以用2種方式來做:
(1)在PHP里使用shell_exec的函數,以shell的方式,啟動一個獨立的PHP腳本執行。這種方式,其實相當於在Web伺服器處理過程中,獨立起了一個shell進程處理你的任務。這里,需要特別注意的是shell_exec的伺服器安全,注意校驗參數,小心避免被帶入shell命令中。這個是比較容易實現的方式。
(2)使用PHP實現一個Server,監聽一個埠,為Web端提供服務。這里的實現方式有很多,通常要配合擴展,例如原生的pthread(多線程),開源擴展swoole等等。

⑻ PHP-php 怎麼實現類似多線程

php本身不支持多線程,但可以通過curl_multi_*系列函數來模擬多線程,以下是我用過的一個函數,但請求不能過多,否則會出現一些難以解釋的問題。希望對你有幫助。

<?php
function rolling_curl($urls, $delay) {
$queue = curl_multi_init();
$map = array();

foreach ($urls as $url) {
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);

curl_multi_add_handle($queue, $ch);
$map[(string) $ch] = $url;
}

$responses = array();
do {
while (($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ;

if ($code != CURLM_OK) { break; }

// a request was just completed -- find out which one
while ($done = curl_multi_info_read($queue)) {

// get the info and content returned on the request
$info = curl_getinfo($done['handle']);
$error = curl_error($done['handle']);
$results = callback(curl_multi_getcontent($done['handle']), $delay);
$responses[$map[(string) $done['handle']]] = compact('info', 'error', 'results');

// remove the curl handle that just completed
curl_multi_remove_handle($queue, $done['handle']);
curl_close($done['handle']);
}

// Block for data in / output; error handling is done by curl_multi_exec
if ($active > 0) {
curl_multi_select($queue, 0.5);
}

} while ($active);

curl_multi_close($queue);
return $responses;
}

function callback($data, $delay) {
preg_match_all('/<h3>(.+)<\/h3>/iU', $data, $matches);
usleep($delay);
return compact('data', 'matches');
}

$urls = array();
for($i=0;$i<5;$i++)
{
array_push($urls,"http://localhost/Push/demo/hello2.php");
}
rolling_curl($urls, 0.5);
?>

⑼ 請問php 多線程要怎麼做呢,我下面這段程序耗時和單線程一樣的

$st=microtime(true);//這一行之後有改動
$t=array();
for($i=0;$i<5;$i++)
{
$a=newRequest();
$a->start();$t[]=$a;
}
foreach($tas$a)$a->join();
$ed=microtime(true);//這一行之前有改動

你代碼中的join用得不對...

閱讀全文

與php線程相關的資料

熱點內容
反詐app在哪裡下安全 瀏覽:745
python判斷linux系統 瀏覽:823
git伺服器如何啟動 瀏覽:43
noi演算法 瀏覽:461
zip解壓縮是電腦自帶的嗎 瀏覽:643
魔術演算法術嗎 瀏覽:783
復式五肖演算法 瀏覽:721
海康威視設備已加密 瀏覽:663
自適應路由演算法 瀏覽:315
pythonxlwt寫入一列 瀏覽:995
性之助app哪裡可以下載 瀏覽:414
安卓如何自己改圖標 瀏覽:848
如何去掉app資源庫的建議 瀏覽:730
中興研發面試要寫演算法嗎 瀏覽:65
linux系統配置文件 瀏覽:601
php登錄網頁模板 瀏覽:931
windownginxphp 瀏覽:509
resync命令 瀏覽:536
dos命令手冊 瀏覽:287
矽谷編程二維數組 瀏覽:41