使用crontab时,php变量$ _SERVER ['SERVER_ADDR']为空

时间:2015-06-10 14:29:33

标签: php

我有一个小脚本,它获取基本信息,如服务器IP-,以及运行脚本的服务器的MAC地址,然后我将结果发布到mysql数据库,这很好用,代码是如下所示。但是,当我使用cronjob执行脚本时,除了存储IP地址之外的所有内容,由于某种原因,$_SERVER['SERVER_ADDR']在作为cronjob执行时为空。

此脚本每分钟运行一次,并在多个Raspberry PI上运行,因此我可以分辨哪个连接到共享作业请求。

$mac_address    = getMacLinux();
$server_ip      = $config['server_ip'];
$client_ip      = $_SERVER['SERVER_ADDR'];
$client_name    = $config['client_name'];


$ch = curl_init();
$url = "{$server_ip}/checkin0.php";
echo "url = {$url}"."<br>";

curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "client_ip={$client_ip}&client_name={$client_name}&client_mac={$mac_address}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch); // Execute

curl_close ($ch); // Close cURL handle

var_dump($output); // Show output

2 个答案:

答案 0 :(得分:0)

我找到了以下

function getServerAddress() {
    if(isset($_SERVER["SERVER_ADDR"]))
    return $_SERVER["SERVER_ADDR"];
    else {
    // Running CLI
    if(stristr(PHP_OS, 'WIN')) {
        //  Rather hacky way to handle windows servers
        exec('ipconfig /all', $catch);
        foreach($catch as $line) {
        if(eregi('IP Address', $line)) {
            // Have seen exec return "multi-line" content, so another hack.
            if(count($lineCount = split(':', $line)) == 1) {
            list($t, $ip) = split(':', $line);
                $ip = trim($ip);
            } else {
                $parts = explode('IP Address', $line);
                $parts = explode('Subnet Mask', $parts[1]);
                $parts = explode(': ', $parts[0]);
                $ip = trim($parts[1]);
            }
            if(ip2long($ip > 0)) {
            echo 'IP is '.$ip."\n";
            return $ip;
            } else
            ; // TODO: Handle this failure condition.
        }
        }
    } else {
        $ifconfig = shell_exec('/sbin/ifconfig eth0');
        preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
        return $match[1];
    }

答案 1 :(得分:0)

查看manual

  

$ _ SERVER是一个包含标题,路径和脚本位置等信息的数组。此阵列中的条目是由Web服务器

创建

PS。您也可以将脚本用作CGI脚本($ _SERVER [&#39; SERVER_ADDRESS&#39;]将是正确的)。您可以尝试fetch,wget,curl ...并从crontab调用脚本,即(server-IP为192.168.0.1):

1 * * * * fetch http://192.168.0.1/my_script.php