Apache / PHP内部服务器错误(500),可能与内存问题有关

时间:2017-07-03 09:03:36

标签: php apache memory

我刚刚转移到新的共享虚拟主机(PHP 7.0),移动了旧的所有文件和数据,然后我的新服务器上出现了这个问题:

我有几个PHP页面(例如mypage1.php),在客户端webbrowser中加载后,将加载另一个我的PHP页面(通过XHR / XMLHttpRequest,例如.mypage2.php,mypage3.php,..., mypage7.php)获取一些数据(比方说JSON)。

当我尝试在我的webbrowser中访问mypage1.php时,它会给出正确的响应,但是当浏览器尝试加载mypage2.php,mypage3.php,...,mypage7.php时,它会返回“内部服务器错误500” “(服务器错误日志:Mon Jul 03 01:50:07.747401 2017] [:error] [pid 612239:tid 139731694188288](12)无法分配内存:[client xxxx:x]无法创建子进程:/ usr / sbin / suphp for / xxx ...)。错误500仅发生在某些页面上(例如mypage3.php和mypage6.php)

首先,我认为它只是一些PHP'memory_limit'问题,所以我试图通过重新配置(从128M增加)memory_limit到160M然后192M来解决它,但它仍然失败。然后我尝试通过使用返回4,194,304(它是从mypage2.php - mypage7.php获取的最大值)的memory_get_peak_usage(true)来找出我的PHP脚本消耗(或分配)内存的程度。再次进行一些测试,错误似乎是随机发生的(有时所有页面都成功加载,有时1或2或3页失败并出现相同的错误消息)。

这让我想到了,Apache的保持活动配置的可能性,所以我检查了它,它是有效的超时= 5和最大= 100,所以我认为它没关系..但仍然,我试图设置HTTP标题'Connection:close'仍然没有给我任何解决方案。

然后,我尝试创建这个简单的脚本,并上传这个'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)

谢谢

1 个答案:

答案 0 :(得分:0)

好的,所以我看到你想要保护一些javascripts,对吧? 这样做验证是非常糟糕的,因为导入(由param返回)脚本可能太大而无法通过浏览器和服务器读取。

它可以抛出HTTP 500,导致服务器无法解析那种大的响应。

最好的解决方法是在mypage1中创建简单的切换,直接指向(并包含)请求的javascript文件:)

另外你可以创建另外1个php文件(javascripts的简单路由器),在这个文件中你可以检查那个参数 - 在此之后你可以包含指定的JS或只返回JS文件名以包含它由主php文件: )