簡體   English   中英

如何同時運行多個 php 文件?

[英]how to run multiple php files at the same time?

搭建環境 nginx/1.18.0 (Ubuntu 20.04) / php7.4-fpm

i'm confused about php multi-threading capabilities, i know that it doesn't support it in stock build and it requires a PHP build with ZTS (Zend Thread Safety) to go with pthreads or parallel

pthreads 似乎是實驗性的、不安全的並且不適合服務器環境,因此保留並行作為更合適的選項

我想要完成的並不復雜,我只是希望服務器每秒運行一次查詢,在 mysql 數據庫中尋找新數據,通過 phpwebsocket 提供服務,而服務器在啟動查詢循環時不會停止一切因為 php 不能一邊嚼口香糖一邊走路。

目前,如果客戶端 1 加載 php 頁面 A,在頁面 A 完成運行之前,他無法訪問任何其他頁面,但是當客戶端 1 仍在運行頁面 A 時,其他客戶端仍然可以訪問其他頁面,這讓我認為它是單線程的session。

另一種方法是讓客戶端重復 ajax 請求,但這似乎浪費帶寬且效率低下。

我想你誤解了正在發生的事情。 您不需要多線程來同時為多個 web 頁面提供服務,並且保持進程運行以服務 websocket 連接不會使其他一切都停止。

目前,如果客戶端 1 加載 php 頁面 A,在頁面 A 完成運行之前,他無法訪問任何其他頁面,但是當客戶端 1 仍在運行頁面 A 時,其他客戶端仍然可以訪問其他頁面,這讓我認為它是單線程的session。

這里的“會話”一詞可能是您實際問題的關鍵:PHP 的session 支持默認使用獨占鎖定。 當您調用session_start()加載現有的 session 時,默認實現會讀取磁盤上的文件,並將其鎖定直到請求結束或直到您調用session_write_close() 其他讀取相同 session 數據的嘗試將等到鎖被釋放。 這可以防止由於不同請求寫入相同 session 的沖突版本而導致的損壞,但這意味着如果他們並行打開多個頁面,用戶將看到延遲。

解決方法很簡單:如果你有一個長時間運行的請求,不要運行session_start() ,或者如果你需要讀取 session,立即運行session_write_close()解鎖它以供其他請求使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM