php進程線程
㈠ php怎樣多線程操作
其實就PHP而言,可以用2種方式來做:
(1)在PHP里使用shell_exec的函數,以shell的方式,啟動一個獨立的PHP腳本執行。這種方式,其實相當於在Web伺服器處理過程中,獨立起了一個shell進程處理你的任務。這里,需要特別注意的是shell_exec的伺服器安全,注意校驗參數,小心避免被帶入shell命令中。這個是比較容易實現的方式。
(2)使用PHP實現一個Server,監聽一個埠,為Web端提供服務。這里的實現方式有很多,通常要配合擴展,例如原生的pthread(多線程),開源擴展swoole等等。
㈡ 討論php程序執行是線程還是進程
進程
進程是什麼?進程是正在執行的程序;進程是正在計算機上執行的程序實例;進程是能分配給處理器並由處理器執行的實體。 進程一般會包括指令集和系統資源集,這里的指令集是指程序代碼,這里的系統資源集是指I/O、CPU、內存等。 綜合起來,我們也可以理解進程是具有一定獨立功能的程序在關於某個數據集合上的一次運行活動, 進程是系統進行資源分配和調度的一個獨立單位。
在進程執行時,進程都可以被唯一的表示,由以下一些元素組成:
進程描述符:進程的唯一標識符,用來和其它進程區分。在Linux中叫進程ID,在系統調用fork期間生成,只是我們通過getpid返回的不是其pid欄位,而是其線程組號tgid。
進程狀態:我們常說的掛起、運行等狀態,其表示的是當前的狀態。
優先順序:進程間的執行調度相關,相對於其它進程而言。
程序計數器:程序中即將被執行的下一條指令的地址,該地址是內核術中或用戶內存空間中的內存地址。
內存指針:包括程序代碼和進程相關數據的指針,還有和其它進程共享內存塊的指針。
上下文數據:進程執行時處理器的寄存器的數據。
I/O狀態信息:包括顯式的I/O請求、分配給進程的I/O設備等
記賬信息:可能包括處理器時間總和、使用的時鍾數總和、時間限制等
線程狀態: 線程當前的狀態。
一個執行棧
私有的數據區: 用於每個線程局部變數的靜態存儲空間
寄存器集: 存儲處理器的一些狀態
以上的這些元素都會放在一個叫做進程式控制制塊的數據結構中。進程式控制制塊是操作系統能夠支持多進程和提供多處理的結構。 當操作系統做進程切換時,它會執行兩步操作,一是中斷當前處理器中的進程,二是執行下一個進程。 不管是中斷還是執行,進程式控制制塊中的程序計數器、上下文數據和進程狀態都會發生變化。 當進程中斷時,操作系統會把程序計數器和處理器寄存器(對應進程式控制制塊中的上下文數據)保存到進程式控制制塊中的相應位置, 進程狀態也會有所變化,可能進入阻塞狀態,也有可能進入就緒態。 當執行下一個進程時,操作系統按規則將下一個進程設置為運行態,並載入即將要執行進程的程序上下文數據和程序計數器等。
線程
進程有兩個特性部分:資源所有權和調度執行。 資源所有權是指進程包括了進程運行所需要的內存空間、I/O等資源。 調度執行是指進程執行過程中間的執行路徑,或者說程序的指令執行流。 這兩個特性部分是可以分開的,分開後,擁有資料所有權的通常稱為進程,擁有執行代碼的可分派部分的被稱之為線程或輕量級進程。
線程有「執行的線索」的意思在裡面,而進程在多線程環境中被定義為資源所有者,其還是會存儲進程的進程式控制制塊。 線程的結構與進程不同,每個線程包括:
每個進程都有一個進程式控制制塊和用戶地址空間,每個線程都有一個獨立的棧和獨立的控制塊,都有自己一個獨立執行上下文。
㈢ php是單線程單進程的么
每個PHP文件的執行是單線程的,但是,伺服器(apache/nigix/php-fpm)是多線程的。每次對某個PHP文件的訪問伺服器都會創建一個新的進程/線程,用來執行對應的PHP文件.
㈣ PHP 到底是單進程還是多進程
一般都是多進程,由php-fpm或者fastcgi開啟並管理的。這個沒什麼意義。
你應該想問的是PHP是單線程還是多線程。
一般PHP是默認單線程的,不過可以用php插件來支持多線程模式。
㈤ 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真的有多進程,多線程嗎
通常意義上所說的多進程是由apache調度的,比如html頁面同時發送5個ajax請求的時候,那麼5個php進程會幾乎同時進行。
PHP本身是不存在多線程的,總是單線程的方式執行。
誤區就是PHP可以通過特別的手段用多進程的方式來模擬多線程,不過幾乎用不到。因為PHP不像java之類的本身有進程管理機制,因此模擬的多線程非常不好控制,同時效率也並不高。