Intereting Posts
Возможно ли, что mysqli_insert_id вернет неверный идентификатор в приложениях с высоким трафиком? php не может подключиться к mysql с ошибкой 13 (но в командной строке) У меня возникают проблемы с Array для структуры JSON в PHP, которые будут использоваться в Javascript Разрешение неправильной кодировки символов при отображении результатов базы данных MySQL после обновления до PHP 5.3 Примечание. Массив для преобразования строк в C: \ xampp \ htdocs \ example \ echo.php в строке 8 Array Как заставить Xdebug работать на Mac Как заменить каждый другой экземпляр определенного символа в строке MySQL? Тонеры CSRF – как правильно реализовать? php zip включает только новые файлы CodeIgniter Facebook SDK 4 с композитором Создание динамического создания WordPress Выход Json_encode umlauts Невозможно повторно назначить автоматически-глобальную переменную _POST Объект PHP ориентирован или нет? Завершающие сессии PHP (разные способы), я не понимаю

Использование try / catch с cURL в PHP

Я думал, что решил это, но я, очевидно, этого не сделал и надеялся, что кто-то сможет пролить свет на то, что я делаю неправильно. Я пытаюсь получить часть PHP-кода для проверки файла на сервере и на основе ответа выполнить действие. Файл представляет собой простой текстовый файл с надписью «true» или «false». Если файл существует или возврат является «истинным», сценарий переходит к одному URL-адресу. Если он не существует (т. Е. Сервер недоступен), или возврат является «ложным», сценарий переходит ко второму URL-адресу. Ниже приведен фрагмент кода, который я использовал до сих пор.

$options[CURLOPT_URL] = 'https://[domain]/test.htm'; $options[CURLOPT_PORT] = 443; $options[CURLOPT_FRESH_CONNECT] = true; $options[CURLOPT_FOLLOWLOCATION] = false; $options[CURLOPT_FAILONERROR] = true; $options[CURLOPT_RETURNTRANSFER] = true; $options[CURLOPT_TIMEOUT] = 10; // Preset $response var to false and output $fb = ""; $response = "false"; echo '<p class="response1">'.$response.'</p>'; try { $curl = curl_init(); echo curl_setopt_array($curl, $options); // If curl request returns a value, I set it to the var here. // If the file isn't found (server offline), the try/catch fails and var should stay as false. $fb = curl_exec($curl); curl_close($curl); } catch(Exception $e){ throw new Exception("Invalid URL",0,$e); } if($fb == "true" || $fb == "false") { echo '<p class="response2">'.$fb.'</p>'; $response = $fb; } // If cURL was successful, $response should now be true, otherwise it will have stayed false. echo '<p class="response3">'.$response.'</p>'; 

Этот пример здесь проходит только через проверку файла. Содержимое «test.htm» является либо «истинным», либо «ложным».

Это может показаться запутанным способом сделать это, но файл находится на стороннем сервере (у меня нет контроля над этим), и его необходимо проверить, поскольку сторонний поставщик может решить принудительно восстановить второй URL-адрес, тогда как выполнение работ по обслуживанию первого URL-адреса. Поэтому я не могу просто проверить наличие файла.

Я тестировал локальную настройку, и все это ведет себя так, как ожидалось. Проблема возникает, когда файла нет. $ Fb = curl_exec ($ curl); не прерывается, он просто возвращает пустое значение. Я думал, что, поскольку это на сервере IIS PHP, проблема может быть связана с PHP на сервере, но теперь я вижу эту проблему локально (в системе Unix).

Если бы кто-нибудь мог пролить свет на то, что я могу сделать неправильно, я бы очень признателен. Также может быть гораздо более короткий способ тестирования этого файла, я мог бы пройти долгий путь, чтобы сделать это, поэтому очень ценю любую помощь.

T

cURL не генерирует исключений, это тонкая оболочка для библиотеки C, к которой она привязана.

Я изменил ваш пример, чтобы использовать более правильный шаблон.

 $options[CURLOPT_URL] = 'https://[domain]/test.htm'; $options[CURLOPT_PORT] = 443; $options[CURLOPT_FRESH_CONNECT] = true; $options[CURLOPT_FOLLOWLOCATION] = false; $options[CURLOPT_FAILONERROR] = true; $options[CURLOPT_RETURNTRANSFER] = true; // curl_exec will not return true if you use this, it will instead return the request body $options[CURLOPT_TIMEOUT] = 10; // Preset $response var to false and output $fb = ""; $response = false;// don't quote booleans echo '<p class="response1">'.$response.'</p>'; $curl = curl_init(); curl_setopt_array($curl, $options); // If curl request returns a value, I set it to the var here. // If the file isn't found (server offline), the try/catch fails and var should stay as false. $fb = curl_exec($curl); curl_close($curl); if($fb !== false) { echo '<p class="response2">'.$fb.'</p>'; $response = $fb; } // If cURL was successful, $response should now be true, otherwise it will have stayed false. echo '<p class="response3">'.$response.'</p>';