В моем приложении Laravel 5.2, работающем на php 7.2 на виртуальном хостинге OVH, мне нужно вызвать специальный URL на удаленном сервере. Поэтому я использую Guzzle так (попробуйте ... catch опущен):
public static function doStuff() {
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', self::remote_address . $jsonFilenameId
);
$visit_ok = $response->getStatusCode() == "200";
}
Он отлично работает "из запущенного приложения" (я не знаю, как его вызвать), я имею в виду, когда пользователь делает что-то на моем сайте, метод контроллера вызывает вышеупомянутый код, и удаленное устройство получает запрос.
Все же я написал команду ремесленника и зарегистрировал ее, и когда я вызываю ее с помощью php artisan my:registered_command
с очень тот же код, я получаю ConnectException
, поэтому удаленное устройство никогда не вызывается. Вот как она вызывается в команде:
use App\Http\Controllers\MyController;
class MyCommand extends Command {
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'my:registered_command';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle() {
MyController::doStuff();
}
}
Ошибка в журнале начинается с:
GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect to re.mov.ed.ip port zzzz: Connection refused (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) in /home/.../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:200
Обратите внимание: я сомневаюсь, что проблема исходит от Guzzle, потому что та же проблема возникла ранее с отправкой электронной почты в тех же условиях (вызывается из командной строки).
Также обратите внимание, что с моей машины разработки команда работает нормально, без выброса ConnectException
.
Почему я получаю это ConnectException
только при вызове метода из командной строки? И в чем разница между вызовом жрет из ремесленника и из приложения? Наконец, что я должен сделать, чтобы обойти эту проблему?
Редактировать: Печать phpinfo
Я добавил следующий код, чтобы иметь возможность обнаружить разницу в php среда:
ob_start();
phpinfo();
$phpInfo = ob_get_contents();
ob_get_clean();
Log::info("PHP INFO REPORT");
Log::info(print_r($phpInfo, true));
Первое отличие : Визуально при запуске «из приложения» я получаю строку в формате html (начиная с <!DOCTYPE html PUBLIC ...
), тогда как при запуске из командной строки с ремесленником я получаю только текст полезной нагрузки (начиная с phpinfo()
).
Другие отличия : система не совпадает, Server API => FPM/FastCGI
из приложения, тогда как Command Line Interface
при запуске из командной строки Loaded Configuration File
также отличается.
cgi, fastcgi и fpm отсутствуют при запуске из командной строки
Есть много других отличий, я не знаю, какие Здесь я должен подчеркнуть, что секция завитков идентична.
Редактировать: попытаться свернуться из командной строки
Я попытался подключиться к удаленному хосту с помощью curl -v re.mov.ed.ip:xyz
и получил
Rebuilt URL to: re.mov.ed.ip:xyz/
Hostname was NOT found in DNS cache
Trying re.mov.ed.ip...
connect to re.mov.ed.ip port xyz failed: Connexion refusée
Failed to connect to re.mov.ed.ip port xyz: Connexion refusée
Closing connection 0
curl: (7) Failed to connect to re.mov.ed.ip port xyz: Connexion refusée
Как мог может быть, что curl из командной строки не находит адрес, тогда как находит его в приложении?
Я не знаю, является ли он актуальным, но я попытался из командной строки ssh-copy-id user@re.mov.ed.ip
и получил connection refused
, а также ssh user@re.mov.ed.ip
не удалось (порт 22 был открыт на маршрутизаторе). С моей машины разработчика ssh user@re.mov.ed.ip
работал.
Редактировать: Нижняя строка
Это выглядит как curl, wget или что угодно пытается "пинговать" "URL из командной строки не разрешен. Даже php @get_headers
вернет false (ошибка ie) из командной строки. Так что моя цель не представляется возможной на (хотя бы OVH) виртуальном хостинге .