file_get_contents() php 超时
file_get_contents() Timeout in php
我知道 php 不提供超时选项,因为它是来自服务器端的 运行。但是我的逻辑需要超时。请解决这个问题
我的PHP:login.php:-
$forms_values = $_POST;
$url = "http://sample.com/sample?params=$forms_values";
$resp = file_get_contents($url);
// It takes much time if sample.com is down.
// so need to set time out here.
$response = json_decode($resp, true);
....
....
if ($response["auth"] == "yes"){
header("index.php");
}
我的htmlindex.html:-
<form action="login.php" method="post" id="clientLogin">
<div>
<input id="username" placeholder="Email or Username" type="text" name="luser" size="30" value="">
</div>
<div>
<input id="passwd" placeholder="Password" type="password" name="lpasswd" size="30" value="">
</div>
<input class="btn" type="submit" value="Sign In">
</form>
<script type="text/javascript">
//This is not working. and obviously delay will happen in server code
//and i cant get it in client side
$(window).load(function () {
var submit = false;
$("#clientLogin").submit(function(e) {
alert("me after 1000 mili seconds");
setTimeout(function(){
alert("me after 1000 mili seconds");
submit = true;
$("#clientLogin").submit(); // if you want
}, 15000);
if(!submit)
e.preventDefault();
});
};
</script>
这个javascript没有用。显然延迟会发生在服务器代码中,我无法从客户端观看它。
这就是我想要的。如果我的 file_get_contents()
函数长时间没有响应,需要终止提交过程(从提交到渲染下一页)。
注意:
请不要让我使用 curl,因为我被指示不要使用 curl。
我无法在客户端获取它
file_get_contents() 中超时的默认值为 60 秒。
您可以通过 default_socket_timeout 设置更改此值。
它在您的代码中也是可行的:
ini_set('default_socket_timeout', 2); // 2 seconds
将代码放在脚本的开头
ini_set('default_socket_timeout', 30); // 30 seconds
默认设置为 60 秒。
或者,考虑使用 cURL 。
它提供了 CURLOPT_CONNECTTIMEOUT 参数来指定尝试建立连接时等待的时间。
set_time_limit() does run globally, but it can be reset locally.
设置脚本允许的秒数运行。如果达到这一点,脚本 returns 出现致命错误。默认限制为 30 秒,或者如果存在,则为 php.ini.
中定义的 max_execution_time 值
调用时,set_time_limit() 会从零重新启动超时计数器。换句话说,如果超时是默认的 30 秒,并且在脚本执行 25 秒后调用 set_time_limit(20),脚本将 运行 在计时之前总共 45 秒出去。
我没有测试过,但你可以在本地设置,离开时重置
<?php
set_time_limit(0); // global setting
function doStuff()
{
set_time_limit(10); // limit this function
// stuff
set_time_limit(10); // give ourselves another 10 seconds if we want
// stuff
set_time_limit(0); // the rest of the file can run forever
}
// ....
sleep(900);
// ....
doStuff(); // only has 10 secs to run
// ....
sleep(900);
// ....
如果5秒内没有收到内容,$resp
将为空
$ctx = stream_context_create(['http'=> ['timeout' => 5]]); // 5 seconds
$resp = file_get_contents($url,null,$ctx);
我知道 php 不提供超时选项,因为它是来自服务器端的 运行。但是我的逻辑需要超时。请解决这个问题
我的PHP:login.php:-
$forms_values = $_POST;
$url = "http://sample.com/sample?params=$forms_values";
$resp = file_get_contents($url);
// It takes much time if sample.com is down.
// so need to set time out here.
$response = json_decode($resp, true);
....
....
if ($response["auth"] == "yes"){
header("index.php");
}
我的htmlindex.html:-
<form action="login.php" method="post" id="clientLogin">
<div>
<input id="username" placeholder="Email or Username" type="text" name="luser" size="30" value="">
</div>
<div>
<input id="passwd" placeholder="Password" type="password" name="lpasswd" size="30" value="">
</div>
<input class="btn" type="submit" value="Sign In">
</form>
<script type="text/javascript">
//This is not working. and obviously delay will happen in server code
//and i cant get it in client side
$(window).load(function () {
var submit = false;
$("#clientLogin").submit(function(e) {
alert("me after 1000 mili seconds");
setTimeout(function(){
alert("me after 1000 mili seconds");
submit = true;
$("#clientLogin").submit(); // if you want
}, 15000);
if(!submit)
e.preventDefault();
});
};
</script>
这个javascript没有用。显然延迟会发生在服务器代码中,我无法从客户端观看它。
这就是我想要的。如果我的 file_get_contents()
函数长时间没有响应,需要终止提交过程(从提交到渲染下一页)。
注意: 请不要让我使用 curl,因为我被指示不要使用 curl。 我无法在客户端获取它
file_get_contents() 中超时的默认值为 60 秒。 您可以通过 default_socket_timeout 设置更改此值。 它在您的代码中也是可行的:
ini_set('default_socket_timeout', 2); // 2 seconds
将代码放在脚本的开头
ini_set('default_socket_timeout', 30); // 30 seconds
默认设置为 60 秒。
或者,考虑使用 cURL 。
它提供了 CURLOPT_CONNECTTIMEOUT 参数来指定尝试建立连接时等待的时间。
set_time_limit() does run globally, but it can be reset locally.
设置脚本允许的秒数运行。如果达到这一点,脚本 returns 出现致命错误。默认限制为 30 秒,或者如果存在,则为 php.ini.
中定义的 max_execution_time 值调用时,set_time_limit() 会从零重新启动超时计数器。换句话说,如果超时是默认的 30 秒,并且在脚本执行 25 秒后调用 set_time_limit(20),脚本将 运行 在计时之前总共 45 秒出去。 我没有测试过,但你可以在本地设置,离开时重置
<?php
set_time_limit(0); // global setting
function doStuff()
{
set_time_limit(10); // limit this function
// stuff
set_time_limit(10); // give ourselves another 10 seconds if we want
// stuff
set_time_limit(0); // the rest of the file can run forever
}
// ....
sleep(900);
// ....
doStuff(); // only has 10 secs to run
// ....
sleep(900);
// ....
如果5秒内没有收到内容,$resp
将为空
$ctx = stream_context_create(['http'=> ['timeout' => 5]]); // 5 seconds
$resp = file_get_contents($url,null,$ctx);