PHP 4 und exec()

Hier können Sie allgemeine Fragen zum Thema MAMP stellen.

Moderators: severin, Dirk Einecke

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

PHP 4 und exec()

Post by almsta » Fri 10. Aug 2007, 12:46

Hallo!

Ich benutze MAMPP 1.6.1 mit PHP 4.4.6.

Folgendes Script bereitet mir Probleme:

Code: Select all

<?php exec(convert -scale 100x 'uploads/articles/test.jpg' 'tmp/test.jpg'); ?>
Dies Sache ist die, dass PHP mittels exec() dieses Command nicht ausführt. Die Permissions sind richtig gesetzt, die Sourcedatei existiert, ImageMagick (mit Patheinstellungen) ist installiert und funktioniert.

Führe ich dieses Scirpt auf der Commandline aus, funktioniert es. Jedoch nicht, wenn ich es über den Apache ausführe.

Könnte mir da jemand einen Tipp geben? Danke :)

PS.: Habe auch schon das Forum durchsucht, aber nichts passendes für mich gefunden.

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Fri 10. Aug 2007, 13:45

Hi almsta,

läuft Apache unter Ihrem Benutzer oder als www? Es wäre auch interessant zu erfahren, auf welches Verzeichnis das Skript zugreift, um zu sehen, ob die entsprechenden Pfade gültig sind. Was bekommen Sie bei:

<?php echo exec('pwd'); ?>

sind Sie da, wo Sie es erwartet hätten?

Gruß,

Severin Kurpiers
living-e AG

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Sat 11. Aug 2007, 17:52

Hallo!

Danke für ihre Antwort! Apache läuft unter meinem Benutzer (stefan) und root:
root 332 0.0 -0.3 69784 5924 ?? Ss 7:23PM 0:00.39 /Applications/MAMP/Library/bin/httpd -k start
stefan 335 0.0 -0.0 63556 808 ?? S 7:23PM 0:00.00 /Applications/MAMP/Library/bin/httpd -k start
stefan 336 0.0 -0.0 63616 708 ?? S 7:23PM 0:00.00 /Applications/MAMP/Library/bin/httpd -k start
stefan 337 0.0 -0.0 63616 708 ?? S 7:23PM 0:00.00 /Applications/MAMP/Library/bin/httpd -k start
stefan 338 0.0 -0.0 63616 708 ?? S 7:23PM 0:00.00 /Applications/MAMP/Library/bin/httpd -k start
stefan 339 0.0 -0.0 63616 708 ?? S 7:23PM 0:00.00 /Applications/MAMP/Library/bin/httpd -k start
stefan 340 0.0 -0.0 63616 704 ?? S 7:23PM 0:00.00 /Applications/MAMP/Library/bin/httpd -k start
pwd gibt mir das richtige Verzeichnis (/Users/stefan/www/ocw) zurück. Habe jetzt auch versucht, das Script mit dem absoluten Pfad auszuführen, leider auch ohne Ergenis :(
Das Script liegt unter /Users/stefan/www/ocw/scaleimage.php.

DocumentRoot im Apache ist auf /Users/stefan/www gesetzt. Habe ich vielleicht irgendwo übersehen, Rechte richtig einzustellen!?

Noch einen schönen Abend :)

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Sun 12. Aug 2007, 12:19

Ich glaube ich bin dem Problem etwas näher gekommen! Anscheinend ist ImageMagick nicht im PATH vom Apache/PHP:
exec("convert -version", $output, $retval); => int(127)
exec("/Applications/ImageMagick/bin/convert -version", $output, $retval); => int(5)
echo exec("which convert", $output, $retval); => no convert in /usr/bin /bin /usr/sbin /sbin
echo exec('echo $PATH', $output, $retval); => /usr/bin:/bin:/usr/sbin:/sbin
Mein System:
TERM_PROGRAM=iTerm.app
TERM=xterm-color
SHELL=/bin/bash
CLICOLOR=true
USER=stefan
__CF_USER_TEXT_ENCODING=0x1F5:0:0
LSCOLORS=ExGxFxdxCxDxDxBxBxExEx
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/Applications/ImageMagick/bin
PWD=/Users/stefan
MAGICK_HOME=/Applications/ImageMagick
SHLVL=1
HOME=/Users/stefan
DYLD_LIBRARY_PATH=/Applications/ImageMagick/lib
LOGNAME=stefan
SECURITYSESSIONID=b9d660
_=/usr/bin/env
Anscheinend verwendet der Apache/PHP nicht die Variablen vom System. Daher kann ich convert nicht aufrufen. ImageMagick habe ich so installiert. Wie kann ich das ändern?

Noch einen schönen Sonntag! :)

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Mon 13. Aug 2007, 07:28

Hi almsta,

da Apache als root gestartet wurde, wird der globale Kontext an die Child-Prozesse weitergegeben, auch wenn sie als 'stefan' laufen. Eine Möglichkeit wäre die PATH-Variable global, d.h. für alle Benutzer zu erweitern, was allerdings ein ziemlich ernster Eingriff in das System darstellt. Die andere Möglichkeit wäre die Executable mit dem vollen Pfad aufzurufen, z.B.:

<?php exec(/Applications/ImageMagick/bin/convert -scale 100x 'uploads/articles/test.jpg' 'tmp/test.jpg'); ?>

Können Sie versuchen, ob dann die Datei

/Users/stefan/www/ocw/uploads/articles/test.jpg

in

/Users/stefan/www/ocw/tmp/test.jpg

konwertiert wird? Stellen Sie sicher, dass in dem Ordner

/Users/stefan/www/ocw/tmp/

geschrieben werden darf.

Gruß,

Severin Kurpiers
living-e AG

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Mon 13. Aug 2007, 09:23

Hallo!
Danke für die Antwort! :)
severin wrote: <?php exec(/Applications/ImageMagick/bin/convert -scale 100x 'uploads/articles/test.jpg' 'tmp/test.jpg'); ?>

Können Sie versuchen, ob dann die Datei

/Users/stefan/www/ocw/uploads/articles/test.jpg

in

/Users/stefan/www/ocw/tmp/test.jpg

konwertiert wird?
Hmm, leider wird die Datei nicht erstellt :/
severin wrote:Stellen Sie sicher, dass in dem Ordner

/Users/stefan/www/ocw/tmp/

geschrieben werden darf.
Rechte stimmen:
1278675 0 drwxr-xr-x 3 stefan stefan 102 Aug 11 19:37 tmp
Die Rechte in uplods/ sind die gleichen, dorthin werden die Bilder mittels einer Weboberfläche hochgeladen.

Bin für weitere Hilfe sehr dankebar :)

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Mon 13. Aug 2007, 10:12

Hi almsta,

und was passiert, wenn Sie das Skript direkt, also ohne Apache ausführen:

Code: Select all

cd /Users/stefan/www/ocw/
php scaleimage.php
Haben Sie schon nach irgendwelchen Hinweisen in Logs (php, apache, allgemein) geschaut?

Gruß,

Severin Kurpiers
living-e AG

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Mon 13. Aug 2007, 10:50

Hallo severin! :)

Führe ich das Script in der Commandline aus, funktioniert es ohne Probleme.

Die Logs bleiben ledier leer :/

Gruß Stefan

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Mon 13. Aug 2007, 11:05

Hi almsta,

OK, das ist also kein php- oder permissions-Problem. Die Logs sind jetzt leer, weil es problemlos funktioniert hat. Sind sie auch leer, wenn man das Skript durch Apache ausführen lässt, was ja nicht funktioniert?

Das nächste Experiment wäre zu überprüfen, ob es auch funktioniert, wenn Apache von Anfang an als 'stefan' läuft. Stellen Sie bitte den Apache-Port auf 8888 um, restarten die Server und versuchen die URL:

http://localhost:8888/ocw/scaleimage.php

Geht's jetzt auch?

Gruß,

Sevrin Kurpiers
living-e AG

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Mon 13. Aug 2007, 11:31

Hallo :)

Habe auf Port 8888 umgestellt. Habe jedoch das gleiche Problem Im Apache-Log steht nun folgendes (wird dieser erst dann aktuallisiert wenn MAMP gestoppt wird?):
[Mon Aug 13 13:27:37 2007] [notice] Digest: generating secret for digest authentication ...
[Mon Aug 13 13:27:37 2007] [notice] Digest: done
[Mon Aug 13 13:27:37 2007] [notice] Apache/2.0.59 (Unix) PHP/4.4.6 DAV/2 mod_ssl/2.0.59 OpenSSL/0.9.7l configured -- resuming normal operations
sh: line 1: convert: command not found

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Mon 13. Aug 2007, 13:41

Hi almsta,

ich glaube, wir suchen an der falschen Stelle. Was passiert, wenn die Datei scaleimage.php folgendermassen aussieht:

<?php exec("/Applications/ImageMagick/bin/convert -scale 100x uploads/articles/test.jpg tmp/test.jpg", $output, $retval); ?>

Gruß,

Severin Kurpiers
living-e AG

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Mon 13. Aug 2007, 14:19

$output:

Code: Select all

array(0) { }
$retval:

Code: Select all

int(5)
Apache-Log:
dyld: Library not loaded: /ImageMagick-6.3.2/lib/libMagick.10.dylib
Referenced from: /Applications/ImageMagick/bin/convert
Reason: image not found
Commandline funktioniert. Habe auch versucht, für die Bilder die absoluten Pfade anzugeben, aber mit dem gleichen Ergebnis :(

Gruß Stefan

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Mon 13. Aug 2007, 15:22

Hi almsta,

uff, ich hab's jetzt. Es ist zwar noch sehr experimental und mit Vorsicht zu geniessen, aber das ist zumindest der erste Ansatz. ImageMagick braucht X11, aber das wissen Sie ja bereits :-)

Ich editierte die Datei:

/Applications/MAMP/Library/bin/envvars

folgendermassen (Kommentare wurden ausgelassen):

Code: Select all

MAGICK_HOME="/Applications//ImageMagick"
export MAGICK_HOME

PATH=${PATH}:${MAGICK_HOME}/bin
export PATH

DYLD_LIBRARY_PATH="${MAGICK_HOME}/lib:/Applications/MAMP/Library/lib:${DYLD_LIBRARY_PATH}"
export DYLD_LIBRARY_PATH
Server neu starten, und Ihr Skript 'scaleimage.php' mit dem Inhalt:

<?php echo exec("convert -scale 100x uploads/articles/test.jpg tmp/test.jpg", $output, $retval); ?>

dürfte jetzt funktionieren.

Es ist noch nicht richtig getestet, und ich weiss noch nicht, welche Auswirkung diese Lösung auf andere Komponenten haben kann, wie sicher sie ist etc.

Gruß,

Severin Kurpiers
living-e AG

almsta
Posts: 15
Joined: Fri 10. Aug 2007, 12:29

Post by almsta » Tue 14. Aug 2007, 07:58

Morgen :)

Habe die neuen Path-Einstellungen in dieser Datei geändert. Leider funktioniert es noch immer nicht:

Apache-Log:
sh: line 1: convert: command not found
(Die Pfade habe ich angepasst, du hast da // drin :))

Gruß Stefan

Nachtrag: Gerade noch mal in den Apache-Log gesehen:
dyld: Library not loaded: /ImageMagick-6.3.2/lib/libMagick.10.dylib
Referenced from: /Applications/ImageMagick/bin/convert
Reason: image not found

severin
Posts: 225
Joined: Thu 8. Mar 2007, 08:03
Location: Germany

Post by severin » Tue 14. Aug 2007, 08:28

Hi almsta,

danke für den Hinweis mit dem doppelten Backslash. Es ist zwar kein Fehler, aber es sieht trotzdem nicht schön aus :-)

Bei mir scheint es jetzt problemlos zu funktionieren. Ich bin mir also ziemlich sicher, dass man es auf diese Weise zum Laufen kriegen kann. Was bekommen Sie, wenn die scaleimage.php-Datei folgendermassen aussieht:

Code: Select all

<?php echo exec('echo $PATH', $output, $retval); echo "<BR>" ?>
<?php echo exec('echo $MAGICK_HOME', $output, $retval); echo "<BR>" ?>
<?php echo exec('echo $DYLD_LIBRARY_PATH', $output, $retval); echo "<BR>" ?>
<?php echo exec("convert -scale 100x uploads/articles/test.jpg tmp/test.jpg", $output, $retval); ?>
bei mir sieht es so aus:

Code: Select all

/usr/bin:/bin:/usr/sbin:/sbin:/Applications/ImageMagick/bin
/Applications/ImageMagick
/Applications/ImageMagick/lib:/Applications/MAMP/Library/lib:
und es wird unter tmp ein skaliertes test.jpg kreiert.

Gruß,

Severin Kurpiers
living-e AG

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest