又改进了下烂服务器的宕机自动重启脚本,让逻辑简单一点.
function string2array($xml)
{
preg_match_all('/([^/i', $xml, $match);
$result = array();
foreach ($match[1] as $x => $y) {
$result[$y] = $match[2][$x];
}
return $result;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://solusvm.virmach.com/api/client/command.php?key=' . $api_key . '&hash=' . $api_hash . '&action=status');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Expect: '
));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 2000);
/* Time-out => 2000ms */
$data = curl_exec($ch);
if ($data) {
$result = string2array($data);
} else {
/* 服务器状态未知. */
exit(0);
}
if (strcmp($result['vmstat'], 'offline')) {
/* 服务器正常 */
} else {
/* 服务器异常 */
curl_setopt($ch, CURLOPT_URL, 'https://solusvm.virmach.com/api/client/command.php?key=' . $api_key . '&hash=' . $api_hash . '&action=boot');
$data = curl_exec($ch);
if ($data) {
$result = string2array($data);
if (strcmp($result['vmstat'], 'booted')) {
/* 不能重新开机 */
} else {
/* 重新开机 */
}
} else {
/* 重启状态未知. */
}
}
然后把脚本加到crontab里面.示例.
*/1 * * * * /usr/bin/php /full-path/check-offline.php
愉快的看着烂服务器.