Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当PHP脚本失败时,如何避免服务器不负责任_Php_Apache_Nginx - Fatal编程技术网

当PHP脚本失败时,如何避免服务器不负责任

当PHP脚本失败时,如何避免服务器不负责任,php,apache,nginx,Php,Apache,Nginx,我找不到这个问题的答案,可能我没有用正确的词来搜索 当PHP脚本失败时(脚本错误、无限循环、无休止的SQL调用等),整个服务器都会“忙碌”。就像所有的资源都被占用了一样,集中精力执行脚本。通过重新启动apache/nginx,服务器将恢复正常 如何避免这种情况?设置脚本的超时时间并不能解决问题,因为即使是10秒的超时时间,服务器也会对所有人不负责任 有没有办法避免这种情况发生?是的,解决脚本问题-问题将停止发生,但我确信有一种方法可以在服务器端防止这种情况 刚才我想到了一个例子。此脚本用于通过调

我找不到这个问题的答案,可能我没有用正确的词来搜索

当PHP脚本失败时(脚本错误、无限循环、无休止的SQL调用等),整个服务器都会“忙碌”。就像所有的资源都被占用了一样,集中精力执行脚本。通过重新启动apache/nginx,服务器将恢复正常

如何避免这种情况?设置脚本的超时时间并不能解决问题,因为即使是10秒的超时时间,服务器也会对所有人不负责任

有没有办法避免这种情况发生?是的,解决脚本问题-问题将停止发生,但我确信有一种方法可以在服务器端防止这种情况

刚才我想到了一个例子。此脚本用于通过调用该网站中的服务获取国家代码。由于某些原因,网站不会随机提供给我们,因此脚本将永远等待接收文件内容

$getcountry = file_get_contents('http://ip-api.com/php/'. getUserIP());
谢谢

设置脚本的超时时间并不能解决问题,因为即使是10秒的超时时间,服务器也会对所有人不负责任

如果服务器设置正确,则不会。设置PHP超时是处理失控脚本的正确方法(除了修复问题的实际原因)。致命的脚本错误将立即终止,不会占用服务器资源

您的帖子似乎假设在任何时候只有一个PHP脚本实例在运行。事实不应如此。您的web服务器应该为PHP处理的每个web请求启动新的进程或线程,达到一些配置的限制。或者,如果您使用的是PHP-FPM,它将被传递给一个PHP进程池。在任何情况下,您的整个服务器都不应该因为一个请求而被锁定

现在,如果您的代码或服务器出现严重问题,那么所有请求可能会花费太长时间,从而挂断进一步的请求。唯一的解决方案是修复问题的根源,并保持合理的超时作为故障保护

对于Apache,您需要检查以下设置:
ServerLimit
StartServers
MaxClients
。对于PHP-FPM,您可以从
max_children
设置开始

此脚本用于通过调用该网站中的服务获取国家代码。由于某些原因,网站不会随机提供给我们,因此脚本将永远等待接收文件内容

$getcountry = file_get_contents('http://ip-api.com/php/'. getUserIP());
这是一个非常常见的问题,必须由代码来解释。您永远不能相信第三方服务会立即返回。显然,将这样的请求卸载到后台进程是最好的(例如cron)。但是,如果需要将其作为正常页面请求的一部分进行,则应始终设置合理的超时。对于使用
文件获取内容的特定示例,请减少套接字超时:

ini_set('default_socket_timeout', 10);  // 10 seconds

谢谢,解释得很清楚,你给了我很好的改进建议。