繁体   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