2011-12-21 68 views
1

我的開發服務器在PHP 5.3.8上順利運行我的PHP Web應用程序。在一臺服務器上工作的PHP代碼,不在另一臺服務器上

然而,從PHP 5.2.6升級我的PHP時生產服務器5.3.8我有幾個問題,這個應用程序,它迫使我命令回滾到5.2(約棄用功能ereg_replace和失蹤date.timezone設置投訴) 0.6。

相同的PHP代碼如何在一個5.3.8服務器上正常工作,而不是另一個?這種行爲的常見原因是什麼?有什麼建議麼?

+5

的錯誤處理可能水平是在你的開發VS督促服務器不同 - 即同樣的問題,只是一些沒有開發可見。 – ChelseaStats 2011-12-21 12:00:23

回答

2

請在兩臺服務器上訪問php.ini(PHP配置文件)。 查找該行「; display_errors」

請在之後比較以下幾行。

這些可用於三個設置可變的選項:

; display_errors 
; Default Value: On 
; Development Value: On 
; Production Value: Off 

; display_startup_errors 
; Default Value: Off 
; Development Value: On 
; Production Value: Off 

; error_reporting 
; Default Value: E_ALL & ~E_NOTICE 
; Development Value: E_ALL | E_STRICT 
; Production Value: E_ALL & ~E_DEPRECATED 
+1

注意:從我們在OP中讀取的內容來看,配置是錯誤的。開發服務器應該有強烈的錯誤報告,而生產服務器應該保持沉默。 – Kaii 2011-12-21 12:13:59

+0

謝謝。生產服務器上有'display_errors = On'。顯然,這看起來像一個錯誤的配置。但我不確定這些消息是否會「STDOUT」實際上會導致應用程序崩潰,正如我正在經歷的那樣。他們不會只是作爲控制檯消息出現嗎? – Gruber 2011-12-21 12:21:24

+1

您可以在日誌文件上記錄錯誤。記錄錯誤的設置位於「php.ini」中的錯誤報告行之下。在設置的可選值之後。 '; log_errors ;默認值:關閉 ;開發價值:在 ;生產值:在 ' – IvenMS 2011-12-21 12:24:07

1

PHP是一種不斷演變的語言,對Java或c#來說也是如此,所以這意味着如果某些函數不被棄用並且相應地更新代碼,就必須檢查文檔。

此外,您還必須確保您的PHP設置在兩臺服務器上都相同。

如果檢查ereg_replace文檔有這樣的導語:

警告此功能已被棄用的PHP 5.3.0的。依靠 這個功能是非常不鼓勵的。

+0

是的,配置文件'php.ini'是一個主要的嫌疑犯。我會花更多時間來調查這一點。爲了避免更多的生產服務器回滾,我將在_new_服務器上部署應用程序,在升級過程中退出舊版本。 – Gruber 2011-12-21 12:35:14

3

您的錯誤級別設置與您的計算機上的設置不同。

FYI:

  • ereg_replace已被廢棄,用強烈勸阻

  • 每次調用日期/時間函數,如果 時區是無效的會產生一個E_NOTICE,和/或者使用系統 設置或TZ環境變量的E_WARNING消息

+0

是的,這是一種可能性。不幸的是,當事情崩潰時我不得不考慮太快,所以我沒有時間調查回滾之前'php.ini'設置的外觀。但是,在升級設置之前_request_reporting = E_ALL&〜E_NOTICE,我不希望升級修改這些設置。感謝您的幫助! – Gruber 2011-12-21 12:11:09

1

你是完全的肯定你的開發服務器運行PHP 5.3.8? 所有ereg_*函數在PHP 5.3.X中都不推薦使用,因此您的代碼不應在沒有任何警告的情況下在PHP 5.3上運行。如果是這樣,那很奇怪,因爲您的開發服務器應該生成比生產服務器更多的警告(例如E_ALL)。檢查您的錯誤報告設置php.ini。 (display_errors,error_reporting

爲了讓它飛起來,您應該真的搜索任何發生的ereg_*,並用preg_*替代這些表達式。

date.timezone可以在您的php.ini中設置。在那之後,我看不到爲什麼你的PHP 5.2.6代碼不能在5.3.6上運行。

+3

ereg_函數仍然可用,只需PHP將發出警告,他們正在這樣做,因爲在不久的將來該函數將被刪除。 – RageZ 2011-12-21 12:05:18

+1

@RageZ這是「棄用」的正確定義。然而,通過用preg代替函數調用而不是僅僅抑制錯誤消息,實際上對棄用作出反應是正確的。 – Kaii 2011-12-21 12:12:00

+0

謝謝。從我看到'ereg_replace'仍然可以在PHP 5.3.8中使用,但非常不鼓勵。我會在適當的時候將其刪除。 – Gruber 2011-12-21 12:15:35

相關問題