Теперь по ряду причин мне нужно регулярно пинговать несколько хостов для отображения панели мониторинга.
Для этого я использую эту функцию PHP:
function PingHost($strIpAddr) {
exec(escapeshellcmd('ping -q -W 1 -c 1 '.$strIpAddr), $dataresult, $returnvar);
if (substr($dataresult[4],0,3) == "rtt") {
//We got a ping result, lets parse it.
$arr = explode("/",$dataresult[4]);
return ereg_replace(" ms","",$arr[4]);
} elseif (substr($dataresult[3],35,16) == "100% packet loss") {
//Host is down!
return "Down";
} elseif ($returnvar == "2") {
return "No DNS";
}
}
Проблема в том, что всякий раз, когда есть неизвестный хост, я получаю сообщение об ошибке в моем журнале ошибок apache (/var/log/apache/error.log). Как мне отключить журналы для этой конкретной функции?
Отключение журналов на виртуальном хосте не является вариантом, поскольку актуальны журналы для этого виртуального хоста, а не пинги.
Спасибо,
Это довольно старый пост, но, увидев, что я нашел его, погружаясь в аналогичную проблему, с которой я столкнулся, я подумал, что это может помочь кому-то другому поделиться.
Я написал следующую функцию для обработки всех вызовов функций командной строки в моем приложении. Он ведет себя аналогично exec с несколькими полезными дополнениями:
escapeshellarg
а позже заменен на команду с помощью strtr
escapeshellcmd
2>&1
как упоминалось выше SilviudФункция следующая:
/**
* @param string $command Use ':param_key' to escape arguments.
* @param string[] $output
* @param int|null $return
* @param string[] $args Use format [ 'param_key' => 'param_value' ].
*
* @return string
*/
function safe_exec( $command, &$output = null, &$return = null, $args = array() ) {
// Escape all args
foreach( $args as $arg_key => $arg_value ) {
$args[ ':' . $arg_key ] = escapeshellarg( $arg_value );
unset( $args[ $arg_key ] );
}
// Escape command and replace params
$command = strtr( escapeshellcmd( $command ), $args ) . ' 2>&1';
// Exec and return
return exec( $command, $output, $return );
} // safe_exec
В качестве быстрого примера использования я использую его для получения статуса лотка наших принтеров Ricoh:
/**
* These values are entered by the user (which is why we escape them),
* but for example:
*
* $address = '10.243.224.42'
* $tray = 1
*/
$oid = '1.3.6.1.4.1.367.3.2.1.2.20.2.2.1.11.2.' . $tray;
$command = "snmpwalk -v 2c -c public :address :oid";
safe_exec( $command, $output, $return, array(
'address' => $address,
'oid' => $oid,
) );
вам нужно что-то изменить в своей функции - в основном exec не обнаруживает стандартную ошибку, которая записывается в файл журнала - вам нужно изменить функцию следующим образом
function PingHost($strIpAddr) {
exec(escapeshellcmd('ping -q -W 1 -c 1 '.$strIpAddr.' 2>&1'), $dataresult, $returnvar);
if (substr($dataresult[4],0,3) == "rtt") {
//We got a ping result, lets parse it.
$arr = explode("/",$dataresult[4]);
return ereg_replace(" ms","",$arr[4]);
} elseif (substr($dataresult[3],35,16) == "100% packet loss") {
//Host is down!
return "Down";
} elseif ($returnvar == "2") {
return "No DNS";
}
if($returnvar == 68)
return "Unknown host";
}