当前位置: 首页 > 知识库问答 >
问题:

松弛PHP API-避免超时错误

容学林
2023-03-14

我试图使用Slack自定义命令,但不太确定如何使用延迟消息,因为Yoda Speak外部API需要超过3秒来响应。

我做了以下工作:

  • 在我的例子中发送了slack命令/yoda,并收到了reponse_url.
  • 使用以下内容以下内容发送到响应URL。
$data_string = '{"response_type": "in_channel", "text":"Checking,please wait..."}' ;
$chs = curl_init();
curl_setopt($chs, CURLOPT_URL, $response_url);
curl_setopt($chs, CURLOPT_POST, true);
curl_setopt($chs, CURLOPT_POSTFIELDS, $data_string); 
curl_setopt($chs, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($chs, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($chs, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chs, CURLOPT_POST, 1);
curl_setopt($chs, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
$results = curl_exec($chs);

    null
$chsres = curl_init();
curl_setopt($chsres, CURLOPT_URL, "https://yoda.p.mashape.com/yoda?sentence=welcome+to+stack");
curl_setopt($chsres, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($chsres, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($chsres, CURLOPT_VERBOSE, true);
curl_setopt($chsres, CURLOPT_TIMEOUT, 45);
curl_setopt($chsres, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chsres, CURLOPT_HTTPHEADER, array('Content-Type:application/json', "X-Mashape-Key:> deMeGoBfMvmshQSemozTqJEY9z0jp1eIhuAjsnx9cQAQsHUifD"));
$resultchsres = curl_exec($chsres);
echo $resultchsres;
$response_url = $_POST['response_url'];
$text = $_POST['text'];

$term = str_replace(' ', '+', $text);

//https://paypal.slack.com/services/B0VQMHX8W#service_setup
//initial respond with 200OK for timeout
ignore_user_abort(true);
set_time_limit(0);
ob_start();
echo('{"response_type": "in_channel", "text": "Checking, please wait..."}');
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Content-Type: application/json");
header('Content-Length: '.ob_get_length());
ob_end_flush();
ob_flush();
flush();


    $chsres = curl_init();
    curl_setopt_array($chsres, array(
        CURLOPT_URL => "https://yoda.p.mashape.com/yoda?sentence=$term",
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_SSL_VERIFYHOST => FALSE,
        CURLOPT_VERBOSE => true,
        CURLOPT_RETURNTRANSFER => FALSE,
        CURLOPT_HTTPHEADER => array('Content-Type:application/json', "X-Mashape-Key: deMeGoBfMvmshQSemozTqJEY9z0jp1eIhuAjsnx9cQAQsHUifD"),
        CURLOPT_RETURNTRANSFER => true
    ));
    $yodaresponse = curl_exec($chsres);

    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $response_url,
        CURLOPT_POST => 1,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => $yodaresponse
    ));

    $resp = curl_exec($curl);
    var_dump($resp);
    curl_close($curl);

我仍然得到相同的错误“该死-那个斜杠命令不起作用(错误消息:超时达到)。在slash-command管理命令”

共有1个答案

江新
2023-03-14

你做的都是对的,只是需要改变顺序。

>

  • 立即以200 OK响应来响应原始请求。详细信息请参见此答案,但本质上:

    ignore_user_abort(true);
    ob_start();
    echo('{"response_type": "in_channel", "text": "Checking, please wait..."}');
    header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
    header("Content-Type: application/json");
    header('Content-Length: '.ob_get_length());
    ob_end_flush();
    ob_flush();
    flush();
    

    然后使用curl发出Yoda API请求,就像您正在做的那样

  •  类似资料:
    • 我们使用API网关来路由我们用编写的实际API。 因此很难准确地管理导致问题的API。 我正在寻找一个自动化的解决方案,比如是否可能通过一些函数或警报在API网关中检测API超时或错误。 请注意,我希望发送获得超时或导致错误的API的通知,而不是所有的API。

    • 本文向大家介绍Bosun Slack Notifications 松弛通知,包括了Bosun Slack Notifications 松弛通知的使用技巧和注意事项,需要的朋友参考一下 示例            

    • 问题内容: 我开发了一个简单的Python应用程序来做一些事情,然后决定使用Tkinter添加一个简单的GUI。 问题在于,当main函数正在执行其工作时,窗口会冻结。 我知道这是一个普遍的问题,我已经读过我应该使用多线程(非常复杂,因为该函数还会更新GUI)或将我的代码划分为不同的函数,每个函数工作一段时间。无论如何,我不想为这样一个愚蠢的应用程序更改代码。 我的问题是:有没有简便的方法可以每秒

    • 我开发了一个简单的Python应用程序,做了一些工作,然后我决定使用Tkinter添加一个简单的GUI。 问题是,当主函数在做它的事情时,窗口冻结了。 我知道这是一个常见的问题,我已经读到我应该使用多线程(非常复杂,因为函数也更新图形用户界面)或者在不同的函数中划分我的代码,每一个都工作一点时间。无论如何,我不想为这样一个愚蠢的应用程序更改我的代码。 我的问题是:是否有可能没有一种简单的方法可以每

    • 我需要从mongo(v3.2.10)集合(使用Pymongo 3.3.0)中获取大量(例如1亿)文档并迭代它们。迭代需要几天时间,我经常遇到由于游标超时而导致的异常。 在我的例子中,我需要在迭代时睡上不可预知的时间。例如,我可能需要:-获取10个文档-睡眠1秒-获取1000个文档-睡眠4小时-获取1个文档等 我知道我可以: 完全禁用超时,但如果可能的话,我希望避免这种情况,因为如果我的代码完全停止

    • 问题内容: 在我的节点应用程序中,我正在使用mocha测试我的代码。使用mocha调用许多异步函数时,出现超时错误()。我该如何解决? 问题答案: 您可以在运行测试时设置超时: 或者,您可以通过编程为每个套件或每个测试设置超时: 有关更多信息,请参阅文档。