本文目錄一覽:
- 1、php真的有多進程,多線程嗎
- 2、PHP-php 怎麼實現類似多線程
- 3、PHP 到底是單進程還是多進程
- 4、php能不能開線程的
- 5、php是單線程單進程的么?
- 6、曲靖java培訓學校告訴你PHP中的(偽)多線程與多進程?
php真的有多進程,多線程嗎
通常意義上所說的多進程是由apache調度的,比如html頁面同時發送5個ajax請求的時候,那麼5個php進程會幾乎同時進行。
PHP本身是不存在多線程的,總是單線程的方式執行。
誤區就是PHP可以通過特別的手段用多進程的方式來模擬多線程,不過幾乎用不到。因為PHP不像java之類的本身有進程管理機制,因此模擬的多線程非常不好控制,同時效率也並不高。
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;$i5;$i++)
{
array_push($urls,””);
}
rolling_curl($urls, 0.5);
?
PHP 到底是單進程還是多進程
一般都是多進程,由php-fpm或者fastcgi開啟並管理的。這個沒什麼意義。
你應該想問的是PHP是單線程還是多線程。
一般PHP是默認單線程的,不過可以用php插件來支持多線程模式。
php能不能開線程的
不能,php本身是不支持多線程的,或者說沒有多線程的概念。如果非要開線程的話,可以藉助linux的縣城概念,來模擬多線程。
php是單線程單進程的么?
每個PHP文件的執行是單線程的,但是,伺服器(apache/nigix/php-fpm)是多線程的。每次對某個PHP文件的訪問伺服器都會創建一個新的進程/線程,用來執行對應的PHP文件.
曲靖java培訓學校告訴你PHP中的(偽)多線程與多進程?
利用WEB伺服器本身的多線程來處理,從WEB伺服器多次調用我們需要實現多線程的程序。
PHP中也能多線程了,那麼問題也來了,那就是同步的問題。曲靖電腦培訓知道PHP本身是不支持多線程的,所以更不會有什麼像Java中synchronize的方法了。那我們該如何做呢?
1.盡量不訪問同一個資源。以避免衝突。但是可以同時像資料庫操作。因為資料庫是支持並發操作的。所以在多線程的PHP中不要向同一個文件中寫入數據。如果必須要寫的話,用別的方法進行同步。如調用flock對文件進行加鎖等。或建立臨時文件,並在另外的線程中等待這個文件的消失while(file_exits(‘xxx’));這樣就等於這個臨時文件存在時,表示其實線程正在操作。如果沒有了這個文件,說明其它線程已經釋放了這個。
2.盡量不要從runThread在執行fputs後取這個socket中讀取數據。因為要實現多線程,需要的用非阻塞模式。即在像fgets這樣的函數時立即返回。。所以讀寫數據就會出問題。如果使用阻塞模式的話,程序就不算是多線程了。他要等上面的返回才執行下面的程序。所以如果需要交換數據最後利用外面文件或數據中完成。實在想要的話就用socket_set_nonblock($fp)來實現。
說了這麼多,倒底這個有沒有實際的意義呢?在什麼時候需要這種用這種方法呢?
答案是肯定的。大家知道。在一個不斷讀取網路資源的應用中,網路的速度是瓶頸。如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245642.html