簡體   English   中英

Apache / PHP內部服務器錯誤(500),可能與內存問題有關

[英]Apache/PHP Internal Server Error (500) with possibility related to memory issue

我只是移到一個新的共享虛擬主機(PHP 7.0),從舊的文件和數據中移走了所有文件和數據,然后在新服務器上遇到了這個問題:

我有幾個PHP頁面(例如mypage1.php),在加載到客戶端Web瀏覽器中后,將再次加載另一個我的PHP頁面(通過XHR / XMLHttpRequest,例如mypage2.php,mypage3.php,...,mypage7.php) )以獲取一些數據(比如說JSON)。

當我嘗試訪問Web瀏覽器中的mypage1.php時,它給出了正確的響應,但是當瀏覽器嘗試加載mypage2.php,mypage3.php,...,mypage7.php時,它返回“內部服務器錯誤500”(服務器錯誤日志:2017年7月3日星期一01:50:07.747401] [:錯誤] [pid 612239:tid 139731694188288](12)無法分配內存:[客戶端xxxx:x]無法創建子進程:/ usr / sbin / suphp / xxx ...)。 錯誤500僅在某些頁面上發生(例如,mypage3.php和mypage6.php)

首先,我認為這只是一些PHP'memory_limit'問題,因此我嘗試通過將memory_limit重新配置(從128M增加)到160M然后是192M來解決此問題,但是仍然失敗。 然后,我嘗試使用memory_get_peak_usage(true)返回4194304(這是從mypage2.php-mypage7.php獲取的最大值)來找出我的PHP腳本消耗(或分配)了多少內存。 再次進行測試,該錯誤似乎是隨機發生的(有時所有頁面均成功加載,有時1或2或3個頁面因相同的錯誤消息而失敗)。

這讓我想到了Apache保持活動配置的可能性,因此我對其進行了檢查,它在timeout = 5和max = 100時處於活動狀態,所以我認為還可以。但是,我仍然嘗試設置HTTP標頭'連接:關閉”,但這仍然沒有給我任何解決方案。

然后,我嘗試創建此簡單腳本,並上傳以下“ mypage1.php”腳本:

<?php
$param1 = isset($_GET['param1'])? $_GET['param1'] : '';

if($param1==='')
echo('<html><head>
<script type="text/javascript" src="mypage1.php?param1=aaa" ></script>
<script type="text/javascript" src="mypage1.php?param1=bbb" ></script>
<script type="text/javascript" src="mypage1.php?param1=ccc" ></script>
<script type="text/javascript" src="mypage1.php?param1=ddd" ></script>
<script type="text/javascript" src="mypage1.php?param1=eee" ></script>
<script type="text/javascript" src="mypage1.php?param1=fff" ></script>
<script type="text/javascript" src="mypage1.php?param1=ggg" ></script>
</head><body>');
else echo('/* javascript */');
?>

令我驚訝的是,即使這個簡單的腳本也給了我同樣的錯誤500(...(12)無法分配內存:...)這次我遇到了死胡同。 我不認為這與PHP內存問題有關(或者,您認為嗎?)。 請根據您的經驗給我一些反饋,想法或任何故事,可能導致此問題的原因(或解決方法)。

編輯:錯誤500僅在某些請求下才會發生(例如,mypage1.php?param1 = ccc,mypage1.php?param1 = fff)

謝謝

好的,我知道您想保護一些JavaScript,對不對? 進行這樣的驗證是一個非常糟糕的主意,因為導入的腳本(由參數返回)可能太大,無法被瀏覽器和服務器讀取。

它會拋出HTTP 500,導致服務器無法解析這種大響應。

最好的解決方案是在mypage1內創建一個簡單的開關,該開關直接指向(並包括)請求的javascript文件:)

另外,您可以再創建1個php文件(用於javascript的簡單路由器),並且可以在該文件內檢查參數-在此之后,您可以包含指定的JS或只返回JS文件名以將其包含在主php文件中:)

暫無
暫無

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

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