我正在構建一個包含大約140個URL的數據庫的PHP應用程序。使用PHP curl下載許多網頁
目標是下載這些網頁內容的副本。
我已經編寫了從我的數據庫中讀取URL的代碼,然後使用curl來獲取頁面的副本。然後它獲取<body> </body>
之間的所有內容,並將其寫入文件。它還考慮到重定向,例如如果我轉到一個URL並且響應代碼是302,它將遵循適當的鏈接。到現在爲止還挺好。
這一切都適用於一些網址(也許20左右),但然後我的腳本超時由於max_execution_time
設置爲30秒。我不想重寫或增加這個,因爲我覺得這是一個糟糕的解決方案。
我想到了2個解決方法,但想知道這些是好還是壞的方法,或者如果有更好的方法。
第一種方法是在數據庫查詢上使用LIMIT
,以便一次將任務分成20行(即如果有140行,則分別運行腳本7次)。我從這個方法中明白,它仍然需要調用script,download.php,7個不同的時間,所以需要通過限制數字。
第二種方法是在腳本中傳入我想要的URL(例如download.php?id=2
)的每個數據庫記錄的ID,然後對它們執行多個Ajax請求(download.php?id=2, download.php?id=3, download.php?id=4
等)。基於$_GET['id']
它可以做一個查詢來查找數據庫中的URL等。理論上我會做140個單獨的請求,因爲它是每個URL設置1個請求。
我讀過一些其他指出排隊系統的帖子,但這些都超出了我的理解。如果這是最好的方法,那麼是否有一個值得一看的特定系統?
任何幫助,將不勝感激。
編輯:目前有140個網址,而且這個網址可能會隨着時間推移而增加。所以我正在尋找一種解決方案,可以在沒有超時限制的情況下進行擴展。
更改max_execution_time可能是最好的解決方案,因爲您確實不知道要花費多長時間才能抓取140頁,或者服務器是否會滯後,並使某些請求比其他請求花費更長的時間。 – Brogan
延長超時並不是一個糟糕的解決方案。使用['set_time_limit(30)'](http://php.net/manual/en/function.set-time-limit.php)循環的每個步驟(或任何對於單個頁面合理的)。這是一個合理的說法,「我將允許每CURL呼叫X秒」。 – apokryfos
我會用ajax調用方法。所以你可以抓住數據庫中的所有記錄,迭代它發送ajax調用,然後在完成時報告。接收到調用(並進行工作)的腳本可能會報告並說出如下內容:「X中的X已完成,Y中有錯誤」 – LordNeo