pthreads php 安裝全過程
簡介

pthreads 是一組允許用戶在 PHP 中使用多線程技術的面向對象的 API。 它提供了創建多線程應用所需的全套工具。 通過使用 Thread, Worker 以及 Threaded 對象,PHP 應用可以創建、讀取、寫入以及執行多線程應用,并可以在多個線程之間進行同步控制。
Tip
建議使用?parallel?作為替代。
Warning
不可以在 web 服務器環境中使用 pthreads 擴展, PHP 多線程開發僅限于命令行模式的應用。
Warning
只能在 PHP 7.2+ 版本中使用 pthreads (v3) 擴展, 在 PHP 7.0 和 7.1 版本中,ZTS 模式是不安全的。
我的PHP7.1安裝pthreads的各種版本在make 時一堆報錯,建議升級PHP7.2
cd /tools
wget https://github.com/krakjoe/pthreads/archive/v2.0.10.zip //改成自己的版本
unzip v2.0.10.zip //改成自己的
cd pthreads-2.0.10 //改成自己的
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
注意:您的php 在編譯的時候需要開啟 –enable-maintainer-zts
./configure --prefix=/usr/local/php --disable-fileinfo --enable-fpm --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-xmlrpc --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt=/usr/local/libmcrypt --enable-zip --with-mysql=/usr/local/mysql --without-pear --enable-maintainer-zts
vim /etc/php.ini
添加
extension=pthreads.so
重啟php
/etc/init.d/php-fpm restart
具體步驟參考:https://www.w3cschool.cn/php/php-thread.html
Threaded 對象:?Threaded?對象提供支持 pthreads 操作的基本功能,包括同步方法以及其他對程序員很有幫助的接口。
Thread 對象: 通過繼承 pthreads 中提供的?Thread?對象并實現?run?方法,用戶可以創建自己的 Thread 對象。 只要線程上下文中持有某個 Thread 對象的引用,就可以讀/寫該對象的屬性,也可以調用該對象的公有(public)或者受保護(protected)的方法。 當在創建 Thread 對象的上下文中調用該對象的?Thread::start()?方法時,pthreads 擴展會在另外的獨立線程中執行該對象的 run 方法。 僅有創建 Thread 對象的線程/進程方可開始(start)或者加入(join)這個 Thread 對象。
Worker 對象:?Worker?是有狀態的線程對象,它在線程開始(通過調用?Thread::start()?方法)之后就可用, 除非代碼中顯式地關閉線程(通過調用?Worker::shutdown()?方法), 否則該對象在線程對象超出作用范圍之后才會失效。 持有 Worker 對象引用的線程上下文可以向 Worker 中入棧(通過調用?Worker::stack()?方法)其他線程對象,Worker 對象將在獨立線程中執行入棧對象的代碼。 Woker 對象的?run?方法會在它的棧中入棧對象之前執行,這樣就可以進行一些必需的資源初始化工作。
Pool 對象:?Pool?對象是 Worker 線程對象池,可以用來在多個 Worker 對象之間分發?Threaded?對象, 這是最易用且高效的多線程編程方式。
Caution
Pool?是標準的 PHP 對象,它并沒有繼承?Threaded?類,所以不可以在多個線程上下文中共享同一個 Pool 對象。
Volatile?類是在 pthreads v3 中新增加的, 用來表示可變的?Threaded?類中的?Threaded?屬性(默認情況下是不可變的)。 它也可以被用來在?Threaded?上下文中存儲數組。
線程間同步: 由 pthreads 擴展創建的所有對象擁有內置的線程間同步機制, 和 Java 語言很類似, 使用?Threaded::wait()?和?Threaded::notify()?方法來實現線程間同步。 調用某一個對象的?Threaded::wait()?方法 會導致當前線程上下文進入等待狀態, 等待另外一個線程上下文調用同一個對象的?Threaded::notify()?方法。 為 PHP?Threaded?對象提供了強有力的線程間同步控制機制。
Caution
應用中會用在多線程場景中的對象都應該從?Threaded?類繼承。
數據存儲: 一般來說,任何可以序列化的數據類型都可以作為 Threaded 對象的屬性,它可以從持有該對象引用的任何線程上下文讀/寫。 并不是所有的數據都采用序列化方式存儲,比如基本類型就是以其真實形態存儲的。 對于不是 Threaded 派生的對象,例如復雜類型、數組以及對象等,都是序列化存儲的,可以從持有 Threaded 對象引用的任何線程上下文中讀取和寫入, 區別就在于對于 Threaed 的派生對象,設置它的成員變量的過程是在獨立線程上下文中執行的。 對于 Threaded 派生對象,在同一時間,不同的線程上下文都可以從該對象中讀取到同樣的數據。
靜態成員: 當創建新的線程上下文(Thread 或 Worker 對象)的時候,靜態成員會被拷貝到新的上下文中。出于安全考慮,資源類型以及包含內部狀態的對象類型的靜態成員會被置空。 實際上這個特性實現了類似線程本地存儲的功能。舉例說明,假設某個類擁有包含數據庫連接信息以及數據庫連接對象靜態成員, 那么當新的線程上下文啟動的時候,僅有數據庫連接信息會被復制到新上下文中,而數據庫連接對象并不會被復制。 所以,需要在新的上下文中根據復制過來的數據庫連接基本信息來初始化數據庫連接對象,新創建的數據庫連接對象是獨立的, 不影響在原上下文中的數據庫連接對象。
Caution
當使用 print_r, var_dump 或者其他函數來進行對象調試的時候,是沒有遞歸保護機制的。
Note:
資源類型: PHP 中很多使用到 Resource 資源類型的擴展或函數并未針對多線程場景進行特殊設計,也就是說,雖然 pthreads 擴展提供了 在多個線程上下文中共享資源類型變量的能力,但是通常來說,你應該把它們視為非線程安全的。 所以,如果要在多個線程上下文中共享資源類型的變量,你應該特別謹慎對待。
Caution
為了提供一個穩定的運行環境,pthreads 擴展在執行過程中會有一些必需的額外限制。
需求
要使用 pthreads 擴展,需要構建 PHP 時啟用 ZTS (Zend Thread Safety)。(--enable-maintainer-zts 選項, Windows 平臺為 --enable-zts)在編譯安裝PHP時添加--enable-maintainer-zts
Caution
ZTS 是構建期配置選項,只能通過構建時通過選項啟用,無法在構建之后啟用。
要構建 pthreads 擴展,你需要啟用了 ZTS 的 PHP 以及 Posix Threads 頭文件(pthread.h)。對于 Windows 平臺,需要使用 redhat 的 pthread-w32 項目中的 pthread.h 頭文件。
安裝
pthreads 擴展由 PECL 主持,使用???github?管理源代碼。 使用標準的 PECL 包安裝方式就可以完成安裝:
PHP版本大于7時,有問題,慎用,??https://pecl.php.net/package/pthreads。
請使用https://github.com/krakjoe/pthreads
運行時配置
此擴展沒有在?php.ini?中定義配置指令。
看不明白的話:pthreads php 安裝全過程(二)
官方文檔:https://www.php.net/manual/zh/intro.pthreads.php
PHP 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。