2017-12-30 8 views
1

Short Story: Ich bin auf der Suche nach einer Arbeit um PHP $ _SERVER [] Variablen nicht verfügbar (nur) in einem Fall, in dem eine PHP-Skriptdatei ausgeführt wird von einem geplanten Windows Taskplaner-Ereignis.

Ich habe zwei Windows 2008 R2 Server mit PHP Version 7.1 auf beiden Servern ausgeführt. Ich habe Server # 1 'Produktion' und Server # 2 'Entwicklung' genannt. Jeder Server hat seine eigene MySQL-Datenbank.

Auf den Seiten, die ich geschrieben habe, habe ich für MySQL db lesen/schreiben, $ _SERVER ['SERVER_NAME'] verwendet, um zu identifizieren, welcher Server das Skript ausführt (wenn die Seite auf der Entwicklung ausgeführt wird) Server verwenden Sie die IP-Adresse der MySQL-Datenbank auf dem Entwicklungsserver Wenn der aktuelle Server der Produktionsserver ist, verwenden Sie die Produktionsdatenbank IP).

Das funktioniert perfekt für mich. Die Ausnahme ist, wenn ich den Windows Taskplaner zur Planung einer automatisierten Aufgabe verwende. In diesem Fall erstelle ich eine einzelne eigenständige PHP-Skriptdatei, um eine E-Mail mit einigen Informationen aus dieser Datenbank zu senden.

  • Ausführen der Seite in einem Browser Ergebnisse in $ _SERVER [ 'SERVER_NAME'] definiert ist (funktioniert gut):

    PHP-Script-Datei eine E-Mail mit einigen Informationen aus den db Ergebnissen in senden.

  • Wenn Windows Task Scheduler läuft die PHP Seite dies in $ _SERVER Ergebnisse [ 'SERVER_NAME'] wird nicht
definiert

Würde jemand, ich könnte die $ _SERVER [] Variablen zur Verfügung zu einer Php-Datei machen wird von einem Windows Geplanten Taks ausgeführt (wobei der Task-Scheduler natürlich auf die PHP.exe mit einem Referee zu dieser .php-Datei verweist)? Oder gibt es einen anderen Weg als die Variable $ _SERVER [], um den Namen des Servers zu ermitteln, auf dem das Skript ausgeführt wird?

+0

, die wenig mit dem Taskplaner zu tun hat. Skripts, die in der Befehlszeilenschnittstelle ausgeführt werden, verfügen auch über keine verfügbaren HTTP-Serverumgebungsvariablen. Verwenden Sie ein Wrapper-Skript oder etwas. – mario

+0

Das ist, was ich tue: meine geplanten Aufgaben sind kleine PHP-Skripte, die curl verwenden, um HTTP-Anfrage an den Server, für bestimmte 'api'-Servlets für jede Aufgabe. – YvesLeBorg

+0

Schön. Vielen Dank. – Reno

Antwort

0

können Sie die Umgebungsvariablen verwenden:

echo $_ENV['COMPUTERNAME']; 

nur sicherstellen, dass die variables_order enthalten E wie EGPCS richtig in php.ini gesetzt.

Oder:

echo getenv('COMPUTERNAME'); 
0

hier ist meine CentOS Lösung. wird ein wenig anders sein als die Windows-Lösung. aber im gleichen Geist. Im Grunde kennzeichne ich einfach den Cron-Job mit der Subdomain (vs Servername). Dann überprüfe ich, ob dies auf localhost oder aus Apache ausgeführt wird und ersetze $ cron_host für die Servervariable nach Bedarf.

Cron:

#crontab -u apache -e 
30 3 * * * php /var/www/vhosts/the/script.php -h=staging.domain.com -t=11:30 

cron_file.php:

// get hostname from varg 
$opts = getopt("h:t:"); 
$cron_host = $opts['h']; // which host to load from creds file 
$time_max = $opts['t']; // time parameter for database call 

creds_file.php:

$localhost = array('127.0.0.1', '::1'); 
$is_localhost = (!is_array($_SERVER) || !isset($_SERVER['REMOTE_ADDR']) || in_array($_SERVER['REMOTE_ADDR'], $localhost)) ? true : false; 
$cron_host = (isset($cron_host)) ? $cron_host : false; 
$host_name = ($is_localhost) ? $cron_host : ((isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']); 
Verwandte Themen