2016-05-11 9 views
0

Ich habe ein sehr seltsames Problem mit einem shell_exec. Was ich versuche, ist ein PhantomJS aufzurufen und ihm 4 Argumente zu übergeben (Benutzer Session ID, URL, Datei speichern Name und Element, die ich nehmen muss) mit shell_exec, um einen Screenshot eines bestimmten Elements auf einem zu machen Seite.shell_exec eines PhantomJS-Skriptes tötet PHP-FPM und Apache

Also, mein Befehl sieht wie folgt aus:

/usr/local/bin/phantomjs --ignore-ssl-errors=true /Users/Igor/Sites/something/public_html/lib/phantomjs/script.js https://testsite.com/dashboard/\?dashboard_view=somedash /Users/Igor/Sites/something/uploads/screenshots/j78O3LstYumBnUi fef81e774e845d44044c167c6847f4d1 chart1 2>&1 

Dies ist, was ich mit shell_exec ausführen:

$command = ' --ignore-ssl-errors=true ' . $this->script . ' ' . escapeshellarg($this->uri) . ' ' . escapeshellarg($path) . ' ' . $this->session . ' ' . $this->element; 
$output = shell_exec("$this->phantomjs $command 2>&1 1> /dev/null"); 

Nachdem ich shell_exec nenne ich deutlich sehen, dass Befehl ausgeführt wurde "ps uax | grep phantom" verwenden, aber es bleibt dort für immer und verursacht einen sofortigen Tod von PHP-FPM (v5.4.45) und Apache2 auf einem Server. Ich muss hinzufügen, dass ich diesen Befehl asynchron über AJAX-Aufruf ausführe.

Ich habe verschiedene Ansätze ausprobiert - mit etwas anderes anstelle von shell_exec, ein Bash-Skript, das Argumente akzeptiert, PhantomJS Runner .... nichts funktioniert.

Wenn ich diesen Befehl in einer Konsole ausführen - es funktioniert ohne Probleme.

Ich bin wirklich aus Ideen - nicht sicher, wie weiter zu gehen, so würde jede Hilfe geschätzt werden.

+0

Fehler in den Protokollen? – Vaviloff

+0

Nein, keine, ich habe alle überprüft. –

+0

Funktioniert Shell_Exec für etwas einfacher? Wie phpinfo. Auch von welchem ​​Benutzer läuft PHP-Skript? Kannst du diesem Benutzer von der Shell helfen und dann versuchen phantomjs zu starten? – Vaviloff

Antwort

0

Vielleicht ist es ein Dateiberechtigungs-Problem? Welche Berechtigungen haben /Users/Igor/Sites/something/public_html/lib/phantomjs/script.js?

+0

Ich habe + x auf ein Skript gesetzt, auch 777 versucht, kein Unterschied. –

0

Ich habe kürzlich ein Projekt veröffentlicht, das PHP den Zugriff auf einen Browser ermöglicht. Holen Sie es hier: https://github.com/merlinthemagic/MTS, Unter der Haube ist eine Instanz von PhantomJS genau wie Sie versuchen zu tun.

Nach dem Download und Setup Sie würden einfach den folgenden Code verwenden:

$myUrl   = "https://testsite.com/dashboard/?dashboard_view=somedash"; 
$windowObj  = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs')->getNewWindow($myUrl); 

//find the dimensions of the element, i **ASSUME** the id of the element is 'chart1', if not enter the correct value here 
$selector = '[id=chart1]'; 
$element = $windowObj->getElement($selector); 
$loc   = $element['location']; 

//tell the screenshot to only get the part you want 
$windowObj->setRasterSize($loc['top'], $loc['left'], ($loc['right'] - $loc['left']), ($loc['bottom'] - $loc['top'])); 

$imageData = $windowObj->screenshot("png"); 

//save your image 
file_put_contents("/path/where/you/wanna/save.png", $imageData); 
+0

Großartig! Ich werde es versuchen. –

0

Ich habe mit PHP7.0 + php-fpm + nginx ähnliches Problem bekam. (sogar läuft exec('phantomjs -v');)

In meinem Fall habe ich endlose Warnmeldung (die versucht, Kind-Prozess neu zu starten) in PHP7.0-fpm.log nach dem Ausführen von Befehl über Nginx. Außerdem gab es kein Problem, wenn ich von der Kommandozeile aus ausführte.

Wie haben Sie phantomjs installiert?

Grabbing-Binärpaket von http://phantomjs.org/download.html anstelle von npm -g install phantomjs löste dieses Problem für mich.

Hoffe das hilft :)

+0

Ich habe es auf die gleiche Weise installiert wie du, aber am Ende musste ich aufgeben. –

Verwandte Themen