2011-03-20 100 views
1

我有幾個關於PHP內存使用情況的問題。我將自己運行一些測試,但獲得各種建議是非常有幫助的。睡眠和循環期間的PHP內存使用情況

我最近了解到PHP函數ignore_user_abort(),它允許腳本在用戶關閉頁面時繼續運行。我正在考慮將此用於我的電子郵件通訊工具而不是Cron作業,因爲配置Cron作業有各種可能。使用AJAX請求讓用戶停留在頁面上,以及在頁面內容交付後運行部分腳本的另一種方法也存在問題。

我的解決方案是在腳本開始處運行調用ignore_user_abort(true),並在內容生成後最後調用flush()以獲得較好的度量,然後運行通訊腳本。或者,使用AJAX做到這一點。

首先,有沒有人看到這種方法的問題?其次,如果我使用了沒有時間限制的腳本,並且每個電子郵件都有一個while循環,那麼如果我一次完成它,內存使用會是什麼樣子?由於我會覆蓋變量,而不是使用新變量,所以我認爲它會很低。

第三,因爲如果我發送大量的電子郵件,比如每次運行1000次,我不想超載我的郵件服務器。用我的cron作業,我每5分鐘運行腳本,發送一批50封電子郵件。如果我一次性完成這項工作,我可以發送50封電子郵件,打電話給睡5分鐘,然後再繼續發送50封電子郵件嗎?如果是這樣,睡眠期間的腳本內存使用情況如何?這會是一種有效的方法嗎?

我真正想在這裏做的是想出一個方法來創建一個通訊工具,不需要複雜的(對於非技術人員)設置一個Cron作業任務(這不是甚至是共享主機上的一個選項),並且不需要用戶在單個頁面上保持瀏覽器打開狀態。

歡迎任何意見建議或意見。謝謝!

+0

['memory_get_usage()'](http://php.net/manual/en/function.memory-get-usage.php)會告訴你。 – alex 2011-03-20 23:25:00

+0

@alex我做了一個基本的測試,在那裏我記錄了啓動內存使用情況,循環100,000次,給一個變量分配一個MD5()'d值(基於循環迭代),並看到最小的內存增加。我假設這意味着循環1000次發送電子郵件的腳本不應該比發送電子郵件50次的腳本增加更多。 同樣基於我的測試,腳本在睡眠週期內佔用相同數量的內存,雖然很難說。 – 2011-03-20 23:43:37

+0

這是你計劃分配的東西嗎? – 2011-03-20 23:44:38

回答

1

在以前的工作中,我們爲PHP中的關鍵函數編寫了一個守護進程,不完全是您描述的內容,但足夠類似 - 肯定會有循環和睡眠。我們非常懷疑它的長期穩定性 - 特別是在內存管理方面 - 所以我們對它進行了非常嚴格的壓力測試。結果非常好,如果不是幾年,代碼已經投入生產並且運行得非常完美。

注意事項:

  • IIRC,PHP提供了一個基於計數器的垃圾收集 。這意味着,與Java中的 不同,引用每個 其他對象的兩個對象將保留在內存中,即使您的程序不能訪問其中的 。你需要 當你放棄你的對象時要小心這個。
  • Web服務器 通常有機制來殺死 長時間運行的腳本。這可能會在這裏擊敗 您的目的 - 特別是如果 服務器的配置不能被調整爲 。
+0

謝謝你的回覆。要解決你的第二個警告,如果我的腳本通過說file_get_contents自己調用並在5秒後超時,該怎麼辦?它會循環50次,再次加載並退出。當它再次加載時,它將運行接下來的50次並重復。思考? – 2011-03-20 23:46:14

+0

黑客,但它可以工作。如果確實有效,我寧願監視在通常的最大執行時間到達之前,看看並重新加載的時間(無論如何 - 我對共享主機不夠熟悉)。我的意思是:數到30秒,而不是50封電子郵件。 – jsalvata 2011-03-21 13:09:48