我有一个cron工作,可以整天从Facebook中提取数据。
每天多次,我收到类似这样的错误:
FacebookAds\Exception\Exception: Connection timed out after 10001 milliseconds in /vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Adapter/CurlAdapter.php:196
Stack trace:
#0 /vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Client.php(204): FacebookAds\Http\Adapter\CurlAdapter->sendRequest(Object(FacebookAds\Http\Request))
#1 /vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Request.php(282): FacebookAds\Http\Client->sendRequest(Object(FacebookAds\Http\Request))
#2 /vendor/facebook/php-ads-sdk/src/FacebookAds/Api.php(151): FacebookAds\Http\Request->execute()
#3 /vendor/facebook/php-ads-sdk/src/FacebookAds/Api.php(193): FacebookAds\Api->executeRequest(Object(FacebookAds\Http\Request))
#4 /vendor/facebook/php-ads-sdk/src/FacebookAds/ApiRequest.php(183): FacebookAds\Api->call('/act_1010015700...', 'GET', Array, Array)
#5 /app/Helpers/FacebookHelper.php(173): FacebookAds\ApiRequest->execute()
#6 /app/Helpers/FacebookHelper.php(271): App\Helpers\FacebookHelper->getInsights('AdAccount', 'act_10100157003...', 'ad', '2017-06-23', '2017-06-23', Array)
#7 /app/Helpers/FacebookHelper.php(360): App\Helpers\FacebookHelper->getReport('AdAccount', 'act_10100157003...', 'ad', '2017-06-23', '2017-06-23', Array)
#8 /app/Console/Commands/CheckWhetherFacebookAdsStartedRunning.php(50): App\Helpers\FacebookHelper->getDashAds('2017-06-23', '2017-06-23')
#9 [internal function]: App\Console\Commands\CheckWhetherFacebookAdsStartedRunning->handle()
#10 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)
#11 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#12 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#13 /vendor/laravel/framework/src/Illuminate/Container/Container.php(539): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#14 /vendor/laravel/framework/src/Illuminate/Console/Command.php(182): Illuminate\Container\Container->call(Array)
#15 /vendor/symfony/console/Command/Command.php(264): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#16 /vendor/laravel/framework/src/Illuminate/Console/Command.php(167): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#17 /vendor/symfony/console/Application.php(869): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /vendor/symfony/console/Application.php(223): Symfony\Component\Console\Application->doRunCommand(Object(App\Console\Commands\CheckWhetherFacebookAdsStartedRunning), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 /vendor/symfony/console/Application.php(130): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 /vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(122): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#21 /artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#22 {main}
Level
----------------
ERROR
我看到here in the Facebook API CURLOPT_CONNECTTIMEOUT
设置为10秒。
我想尝试将超时调整为20秒。
我一直无法弄清楚如何在不编辑该库中的源代码的情况下更改该值(我绝对不想这样做,因为它会在下次升级时被覆盖)。
我正在调用$ad->getInsights($fields, $params, true);
(code),然后执行该请求。
如何覆盖Facebook默认使用的Curl选项?
答案 0 :(得分:0)
在文件中:
/facebook-php-ads-sdk/src/FacebookAds/Http/Adapter/CurlAdapter.php
我更改了:
CURLOPT_CONNECTTIMEOUT => 10
到
CURLOPT_CONNECTTIMEOUT => 20
到目前为止每次都可以使用...
答案 1 :(得分:0)
在 2021 年仍然存在同样的问题,正在寻找答案。 从@Ryan 评论中查看问题并检查代码的当前状态。
所以现在在 2021 年有一种“简单”的方法来做到这一点:
$api = Api::init($appId, $appSecret, $appToken);
$opts = $api->getHttpClient()->getAdapter()->getOpts();
if ($opts instanceof \ArrayObject && $opts->offsetExists(CURLOPT_CONNECTTIMEOUT)) {
$opts->offsetSet(CURLOPT_CONNECTTIMEOUT, 30);
$api->getHttpClient()->getAdapter()->setOpts($opts);
}