2011-11-02 78 views
3

我想運行一個PHP腳本,每秒運行一次以更新MySQL表。PHP可以同時或一個一個地處理多個請求嗎?

假設該腳本需要0.99秒,這將阻止網站訪問者在腳本執行時訪問網站嗎?他們會收到超時/內部服務器錯誤? 如果是這樣,有沒有辦法解決這個問題,或許使用某種多線程選項?

爲了給出更多的細節,我試圖創建一個角色扮演遊戲,其中有怪物。這些怪物存儲在一個名爲rpg_monsters的表中。怪物表有一個ID,目標,x和y場,並且需要看他們是否在對方的範圍內攻擊可能的敵方。 如果他們在彼此的範圍內,他們需要將他們的目標更新爲該怪物ID。今天我仍然有很少的怪物,但是這個數字將來會增加,從而增加劇本的執行時間。

我知道在正常情況下,您需要專門的服務器來完成這種緊張的工作。但是,我想看看在變得過載之前我能推多少PHP/MySQL。

預先感謝您!

+4

簡答題;沒有。多個用戶可以一次訪問腳本/頁面。想象一下,有多少人在Facebook上加載相同的文件。 – OptimusCrime

+0

永遠不要做這樣的假設:D(0,99秒的跑步) – dynamic

+0

我建議你使用AJAX來填補這個目的。例如,您可以每秒更新一次AJAX調用PHP文件來更新MySQL表,然後讓它檢查最後更新的字段,以便如果多個用戶發送AJAX請求,則每1秒只允許更新一次。無論是或者您可以使用Cron選項卡或計劃任務,他們在那裏獨立於客戶端請求執行這些操作。漫漫漫步漫步...... – ShadowScripter

回答

2

簡答題:沒有。

每一個新的PHP腳本調用都會創建一個新的PHP實例(通常是一個新的進程,在某些情況下它只是在新線程下運行,但這不會影響您的問題),並且多個實例獨立運行其他。

作爲外殼點,嘗試運行此腳本:

<?php 

    sleep(20); 

?> 

...併發送一個新的請求/在運行時啓動另一個實例。你會看到這個不會以任何方式影響另一個。

要添加更多有關線程元素的信息:PHP本身不能是多線程的。如果你在最近的IIS中運行它作爲一個IIS模塊(關閉我的頭頂,我不記得這是從什麼時候開始的),PHP實例將在IIS進程的一個新線程下運行 - 但是你不能開始一個新的從PHP內部線程。在其他每個設置(AFAIK)中,每個新的PHP實例都會創建一個新進程。

+0

當php腳本完成執行時,該進程會發生什麼?一次有多少人可以訪問該網站? –

+0

@D_Vaibhav這個答案很糟糕,但我沒有時間重寫它。這一切都依賴於所謂的SAPI--一些SAPI(我認爲mod_php?)爲每個請求分配一個新進程,並在請求結束時死掉。 FPM擁有一個一次處理一個請求的進程池,但進程是循環使用的。一些SAPI使用線程模型,其中創建新線程來處理請求並在之後終止。我不確定現有的SAPI是否可以執行此操作,但您也可以維護一個線程池並回收它們。什麼適用於您取決於您​​正在使用哪個SAPI。 – DaveRandom

3

人們仍然可以訪問您的網站。通常你要做的是用php腳本更新crontab中的數據庫,然後讓apache爲web請求提供服務。 Apache通常會限制它可以擁有的併發連接數量,因此這將成爲您同時訪問該網站的人數的限制。

您可能遇到的唯一問題是鎖定表的SQL查詢,以便腳本對同一個表運行查詢,並且必須等待第一個查詢完成。正確地構造更新查詢應該可以避免這種情況。

相關問題