當前位置:首頁 » 編程語言 » php多線程與多進程

php多線程與多進程

發布時間: 2022-07-07 17:39:13

1. php如何來多線程運行多個腳步

測試多進程PHP調用執行shell程序性能。。
寫php代碼實現多進程調用肯定比較難,因為在PHP沒有統一的進程管理庫。win和linux不一樣,也曲折。

僅僅為了測試。把PHP單次exec調用py的代碼放在活動的伺服器(比如apache或iis或nginx任何)上。然後用apache的ab工具測試一下壓力就知道性能了。

2. 探討nginx與php-fpm是不是以多進程多線程方式運行的

這個問題比較初級,官方文檔上的資料都是很全的。

Nginx 是非阻塞IO & IO復用模型,通過操作系統提供的類似 epoll 的功能,可以在一個線程里處理多個客戶端的請求。
Nginx 的進程就是線程,即每個進程里只有一個線程,但這一個線程可以服務多個客戶端。

PHP-FPM 是阻塞的單線程模型,pm.max_children 指定的是最大的進程數量,pm.max_requests 指定的是每個進程處理多少個請求後重啟(因為 PHP 偶爾會有內存泄漏,所以需要重啟).
PHP-FPM 的每個進程也只有一個線程,但是一個進程同時只能服務一個客戶端。

大多數的 Linux 程序都傾向於使用進程而不是線程,因為 Linux 下相對來說創建進程的開銷比較小,而 Linux 的線程功能又不是很強大。

3. PHP在什麼情況下會使用多進程

嚴格來說 PHP 的多線程指的應該是 pecl 中的 pthreads. 這個東西很少有人會用到,我也不建議大家用,因為通常情況需要用到 pthreads 的時候通常是這個工作不適合 PHP 來做。

如果說 PHP 和多線程有什麼關系,那就是 PHP 不同於其他的一些後端語言,通常 PHP 的運行環境是由 PHP-FPM
管理的若干個獨立的 PHP 進程組成的。因此 PHP 天然地可以非常方便地橫向擴充:增加 PHP-FPM 的進程數,甚至把 PHP-FPM
分散在兩台伺服器上。

4. php的進程是什麼樣的,單進程多進程,線程呢

進程就像地主,有土地(系統資源),線程就像佃戶(線程,執行種地流程)

進程-資源分配的最小單位,相對健壯,崩潰一般不影響其他進程,但是切換進程時耗費資源,效率差些。

線程-程序執行的最小單位,沒有獨立的地址空間,一個線程死掉可能整個進程就死掉,但是節省資源,切換效率高。

5. 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');
?>

6. PHP 到底是單進程還是多進程

一般都是多進程,由php-fpm或者fastcgi開啟並管理的。這個沒什麼意義。
你應該想問的是PHP是單線程還是多線程。
一般PHP是默認單線程的,不過可以用php插件來支持多線程模式。

7. 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');
?>

8. php真的有多進程,多線程嗎

通常意義上所說的多進程是由apache調度的,比如html頁面同時發送5個ajax請求的時候,那麼5個php進程會幾乎同時進行。
PHP本身是不存在多線程的,總是單線程的方式執行。

誤區就是PHP可以通過特別的手段用多進程的方式來模擬多線程,不過幾乎用不到。因為PHP不像java之類的本身有進程管理機制,因此模擬的多線程非常不好控制,同時效率也並不高。

9. 討論php程序執行是線程還是進程

進程

進程是什麼?進程是正在執行的程序;進程是正在計算機上執行的程序實例;進程是能分配給處理器並由處理器執行的實體。 進程一般會包括指令集和系統資源集,這里的指令集是指程序代碼,這里的系統資源集是指I/O、CPU、內存等。 綜合起來,我們也可以理解進程是具有一定獨立功能的程序在關於某個數據集合上的一次運行活動, 進程是系統進行資源分配和調度的一個獨立單位。

在進程執行時,進程都可以被唯一的表示,由以下一些元素組成:

  • 進程描述符:進程的唯一標識符,用來和其它進程區分。在Linux中叫進程ID,在系統調用fork期間生成,只是我們通過getpid返回的不是其pid欄位,而是其線程組號tgid。

  • 進程狀態:我們常說的掛起、運行等狀態,其表示的是當前的狀態。

  • 優先順序:進程間的執行調度相關,相對於其它進程而言。

  • 程序計數器:程序中即將被執行的下一條指令的地址,該地址是內核術中或用戶內存空間中的內存地址。

  • 內存指針:包括程序代碼和進程相關數據的指針,還有和其它進程共享內存塊的指針。

  • 上下文數據:進程執行時處理器的寄存器的數據。

  • I/O狀態信息:包括顯式的I/O請求、分配給進程的I/O設備等

  • 記賬信息:可能包括處理器時間總和、使用的時鍾數總和、時間限制等

  • 以上的這些元素都會放在一個叫做進程式控制制塊的數據結構中。進程式控制制塊是操作系統能夠支持多進程和提供多處理的結構。 當操作系統做進程切換時,它會執行兩步操作,一是中斷當前處理器中的進程,二是執行下一個進程。 不管是中斷還是執行,進程式控制制塊中的程序計數器、上下文數據和進程狀態都會發生變化。 當進程中斷時,操作系統會把程序計數器和處理器寄存器(對應進程式控制制塊中的上下文數據)保存到進程式控制制塊中的相應位置, 進程狀態也會有所變化,可能進入阻塞狀態,也有可能進入就緒態。 當執行下一個進程時,操作系統按規則將下一個進程設置為運行態,並載入即將要執行進程的程序上下文數據和程序計數器等。

    線程

    進程有兩個特性部分:資源所有權和調度執行。 資源所有權是指進程包括了進程運行所需要的內存空間、I/O等資源。 調度執行是指進程執行過程中間的執行路徑,或者說程序的指令執行流。 這兩個特性部分是可以分開的,分開後,擁有資料所有權的通常稱為進程,擁有執行代碼的可分派部分的被稱之為線程或輕量級進程。

    線程有「執行的線索」的意思在裡面,而進程在多線程環境中被定義為資源所有者,其還是會存儲進程的進程式控制制塊。 線程的結構與進程不同,每個線程包括:

  • 線程狀態: 線程當前的狀態。

  • 一個執行棧

  • 私有的數據區: 用於每個線程局部變數的靜態存儲空間

  • 寄存器集: 存儲處理器的一些狀態

  • 每個進程都有一個進程式控制制塊和用戶地址空間,每個線程都有一個獨立的棧和獨立的控制塊,都有自己一個獨立執行上下文。

10. 多進程跟多線程如何取捨,在不同系統,不同場景下

一般多進程用於伺服器比較多,多線程用於客戶端比較多。
比如PHP伺服器是典型的多進程。
游戲客戶端,訊雷等下載工具,QQ等聊天工具,都是多線程的。
不過事情也不絕對,從任務管理器上看,谷歌瀏覽器是多進程的,而絕大多數windows伺服器程序是多線程的。而Linux server用多進程非常多。

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:239
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726