WGET på Windows gennem PHP exec () virker ikke

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kan ikke få wget til at arbejde, når de kaldes fra PHP gennem exec().


Koden er:


exec('wget -b --timeout=300 --no-check-certificate -O c:wgetlog.txt http://localhost/project/someparam/somevalue > c:wgetout.txt')


Den kaldte URL er en handling fra et projekt baseret på Zend Framework, der manipulerer nogle data i en MySQL database.


Når ovenstående er udført, oprettes kun 'c: \ wgetout.txt' og er tom.


Opsætningen er som følger:



  • Windows 7

  • XAMPP

  • PHP ver 5.3.5

  • wget nyeste version herfra

  • PHP safe\_mode er slukket



wget er installeret i 'C: \ Program Files (x86) \ GnuWin32 \ bin', og dette tilføjes til Windows PATH-variablen. [16]


Jeg ved, at wget-opsætningen virker, fordi når du kører ovenstående exec-parameter (som echoed)


wget -b --timeout=300 --no-check-certificate -O c:\wgetlog.txt http://localhost/project/someparam/somevalue > c:\wgetout.txt


I en kommandoprompt går det fint, jeg får de forventede resultater i databasen, og begge filer 'C: \ wgetlog.txt' og 'C: \ wgetout.txt' oprettes, hvor sidstnævnte indeholder wget's output ( proces id osv.).


LATER EDIT:


Fik det til at arbejde takket være Crontabs forslag og brugte den absolutte vej til at ringe wget, også vedlagt den i dobbelt citater.


Brugt WSH COM objekt til at køre det i stedet for almindeligt exec().


Også på Windows fungerer -b -parametret ikke, hvis output ikke er rettet et sted. Da jeg ikke er særlig interesseret i udgangen, rettede jeg det til > NUL 2>&1 (dette inkluderer også fejl).


Jeg lavede hurtigt denne funktion for at hjælpe mig med at teste mit projekt på en Windows-maskine og have wget arbejde, så her er det, hvis nogen finder det nyttigt:


public function execWget($URL, $intTimeout = 30, $blnInBackground = true) {
    if (preg\_match("/Win/i", PHP\_OS)) {
        $runCommand = '"C:Program Files (x86)GnuWin32inwget" ' . ($blnInBackground?'-b ':'') . '--timeout=' . (int)$intTimeout . ' --no-check-certificate ' . $URL . ($blnInBackground?' > NUL 2>&1':'');
        $WshShell = new COM("WScript.Shell");
        $oExec = $WshShell->Run($runCommand, 7, false);
    } else {
        $runCommand = 'wget ' . ($blnInBackground?'-b ':'') . '--timeout=' . (int)$intTimeout . ' --no-check-certificate ' . ($blnInBackground?'-O /dev/null ':'') . $URL . ($blnInBackground?' > /dev/null 2>&1':'');
        exec($runCommand);
    }
}


Vær opmærksom på at den er tilpasset til mit eget setup (absolut vej til wget), det er kun til testformål (kun brug Windows-maskinen til test, den aktuelle produktionsmaskine kører Linux), OS-kontrolmetoden Det er måske ikke det bedste mv.

Bedste reference


Prøv at bruge en absolut sti til wget - det er sandsynligvis ikke i dit scripts sti. For at undgå at bruge den absolutte sti, kan du prøve at tilføje putenv("PATH=<whatever-paths-you-need-colon-delimited>"); i dit script før du får adgang til wget. En anden måde ville være at ændre PATH-miljøvariablen direkte, uanset hvilken bruger der kører din webserver (og dermed hvilken som helst bruger kører PHP-tolken).