Guzzle ConnectException при запуске команды ремесленника, в то время как она прекрасно работает в приложении - PullRequest
0 голосов
/ 10 апреля 2020

В моем приложении 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) виртуальном хостинге .

...