file_get_contents()php

时间:2016-06-09 13:06:30

标签: javascript php timeout file-get-contents

我知道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");
}

我的HTML index.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()函数没有长时间响应,则需要终止提交过程(从提交到呈现下一页)。

注意: 请不要让我使用卷曲,因为我被指示不使用卷曲。 我无法在客户端获得它

5 个答案:

答案 0 :(得分:2)

file_get_contents()中超时的默认值为60秒。 您可以通过default_socket_timeout设置更改此值。 它在你的代码中也是可行的:

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

答案 1 :(得分:1)

将代码放在脚本的开头

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

默认设置为60秒。

答案 2 :(得分:0)

或者,请考虑使用 cURL

它提供CURLOPT_CONNECTTIMEOUT参数以指定尝试建立连接时等待的时间。

答案 3 :(得分:0)

  

set_time_limit()确实全局运行,但可以在本地重置。

设置允许脚本运行的秒数。如果达到此值,脚本将返回致命错误。默认限制为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);
// ....

答案 4 :(得分:0)

如果您在5秒钟内未收到内容,则$resp将为空


$ctx = stream_context_create(['http'=> ['timeout' => 5]]); // 5 seconds
$resp = file_get_contents($url,null,$ctx);