2013-11-19 5 views
3

не имеют достаточной репутации помечать это правильно (рубин, PHP, сокет, спасение)PHP эквивалент спасения Руби

Я не практиковал мой PHP в течение длительного времени, так как я делал более Рубиновые скрипты. Я смущен просить о помощи в этом.

Я знаю, что в Ruby я могу использовать спасение, чтобы предотвратить сбой скрипта в случае ошибки, и я надеюсь получить то же самое с PHP.

Например, в Ruby:

require 'socket' 

begin puts "Connecting to host..." 
host = TCPSocket.new("169.121.77.3", 333) 
# This will (intentionally) fail to connect, triggering the rescue clause. 
rescue puts "Something went wrong." 
# Script continues to run, allowing, for example, the user to correct the host IP. 
end 

Мой PHP код немного грязный - это было довольно давно.

function check_alive($address,$service_port) { 
    /* Create a TCP/IP socket. */ 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if ($socket === false) { 
     echo socket_strerror(socket_last_error()); 
    } 
    else { 
     echo null; 
    } 
    $result = socket_connect($socket, $address, $service_port); 
    if ($result === false) { 
     echo socket_strerror(socket_last_error($socket)); 
     return 1; 
    } 
    else { 
     echo null; 
    } 
    socket_close($socket); 
    return 0; } 
    $hosts = [...]; 
    // list of hosts to check 
    foreach($hosts as $key=>$host) { 
     check_alive($hosts); 
    } 

По существу, у меня есть массив хостов, и я бы хотел проверить, живы ли они. Не обязательно, чтобы ВСЕ хосты были живы, поэтому вот где я застрял - первый мертвый хост в массиве сбой скрипта.

Любые предложения были бы очень оценены - я согласен с тем, что я не полностью понимаю связи сокетов в PHP.

+0

-1 формат ваш код и ваш вопрос! Вы пытались использовать [* Try & catch *] (http://us3.php.net/exceptions)? – alfasin

+1

Он явно не знает, как форматировать, и это был его первый выстрел в него. Не нужно ниспровергать его на таких вещах, скорее объясните или сделайте это за него. – Zippie

+0

Ну, вы знаете, удачи с PHP: http://www.phpsadness.com/sad/38 – SirDarius

ответ

5

PHP-эквивалент:

try { ... } catch (...) { ... } 

Если вы используете PHP 5.5, также есть:

try { ... } catch (...) { ... } finally { ... } 

Вы можете иметь несколько уловов положений, каждый ловя другой класс исключения.

Последняя часть всегда пробег, в том числе, когда возникло исключение.

+4

* Всегда *, если фатальная ошибка не происходит где-то внутри блока try. – SirDarius

+0

Попробуйте/поймать именно то, что я искал! Спасибо, что напомнили. Я также посмотрю на fsockopen, спасибо за это :) –

2

Ниже приведен PHP эквивалент exception handling:

try { // equivalent of Ruby `begin` 

} catch(Exception $e) { // equivalent of Ruby `rescue(e)` 

}