Heim > Artikel > Backend-Entwicklung > PHP-Methode zum Ausführen externer Befehle unter Linux
Dieser Artikel stellt hauptsächlich vor, wie PHP externe Befehle unter Linux implementiert. Ich hoffe, dass er für alle hilfreich ist.
Verzeichnis:
1. Einführung in den Aufruf externer Befehle in PHP
2. Informationen zu Sicherheitsproblemen
3 . Über das Timeout-Problem
4. Über die Probleme, die auftreten, wenn PHP Befehle in der Linux-Umgebung ausführt
1. Einführung in den Aufruf externer Befehle in PHP
Um externe Befehle in PHP aufzurufen, können Sie drei Methoden verwenden: 1> eine spezielle Funktion aufrufen, 2> die Funktion popen(), um den Prozess zu öffnen:
Methode 1: Verwenden Sie die von PHP bereitgestellten Spezialfunktionen (vier):
PHP bietet 4 Spezialfunktionen zum Ausführen externer Befehle: exec(), system (), passthru(), shell_exec()
1) exec()
Prototyp: string exec ( string $command [, array &$output [, int &$return_var ] )
Erklärung: Wenn exec einen Befehl außerhalb des Systems ausführt, gibt es das Ergebnis nicht aus, sondern gibt die letzte Zeile des Ergebnisses zurück. Wenn Sie das Ergebnis erhalten möchten, können Sie es mit dem zweiten Parameter in das angegebene Array ausgeben. Ein Datensatz in diesem Array stellt eine Ausgabezeile dar. Das heißt, wenn das Ausgabeergebnis 20 Zeilen enthält, enthält dieses Array 20 Datensätze. Wenn Sie daher die Ergebnisse des Aufrufs verschiedener externer Systembefehle wiederholt ausgeben müssen, ist es am besten, das Array unset($output) bei der Ausgabe zu löschen die Ergebnisse jedes externen Systembefehls. Der dritte Parameter wird verwendet, um den Statuscode der Befehlsausführung zu erhalten. Normalerweise wird 0 zurückgegeben, wenn die Ausführung erfolgreich ist.
<?php exec("dir",$output); print_r($output); ?>
2) system()
Prototyp: string system ( string $command [, int &$return_var ] )
Erklärung: Der Unterschied zwischen System und Exec besteht darin, dass das System, wenn es einen Befehl außerhalb des Systems ausführt, den angegebenen Befehl ausführt, die Ergebnisse ausgibt und zurückgibt. Der zweite Parameter ist optional und wird verwendet, um den Statuscode abzurufen, nachdem der Befehl ausgeführt wurde.
<?php system("pwd",$result); print $result;//输出命令的结果状态码 ?>
Eine kurze Einführung in den Ergebnisstatuscode des zweiten Parameters:
Wenn 0 zurückgegeben wird, ist der Vorgang erfolgreich erfolgreich.
Wenn in Bash ein Fehler in einem schwerwiegenden Signal auftritt, gibt Bash 128+Signalnummer als Rückgabewert zurück.
Wenn der Befehl nicht gefunden wird, wird 127 zurückgegeben.
Wenn der Befehl gefunden wird, aber nicht ausführbar ist, wird 126 zurückgegeben.
Außerdem gibt Bash selbst den Rückgabewert der letzten Anweisung zurück.
Wenn während der Ausführung ein Fehler auftritt, wird ein Wert ungleich Null zurückgegeben.
Schwerwiegendes Signal: 128 + signo
Befehl nicht gefunden: 127
Ausführung nicht möglich: 126
Shell-Skript erfolgreich ausgeführt: Gibt den letzten Befehls-Exit-Status zurück
Schwerwiegend während der Ausführung: Rückgabe ungleich Null
3) passhru()
Prototyp: void passhru ( string $ Befehl [, int &$return_var ] )
Erklärung: Der Unterschied zwischen Durchgang und System: Durchgang gibt die Ergebnisse direkt an den Browser aus, ohne einen Wert zurückzugeben, und kann Binärdaten wie Bilddaten ausgeben. Der zweite Parameter ist optional und ist der Statuscode.
<?php header("Content-type:image/gif"); passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm"); ?>
4) shell_exec()
Prototyp: string shell_exec ( string $cmd : >
Prototyp: Backtick ` (mit ~ in derselben Taste), um Befehle außerhalb des Systems auszuführen
Beschreibung: Wenn Sie diese Methode verwenden, um Befehle außerhalb des Systems auszuführen, stellen Sie sicher, dass die Andernfalls können Sie diesen Backtick nicht verwenden, um Befehle außerhalb des Systems auszuführen.
<?php $output = shell_exec('ls -lart'); echo "<pre class="brush:php;toolbar:false">$output"; ?>
Methode 3: Verwenden Sie die Funktion popen(), um den Prozess zu öffnen
Prototyp: Ressource Popen (String $command, String $mode)
Beschreibung: Kann mit Befehlen interagieren. Die zuvor eingeführte Methode kann den Befehl nur einfach ausführen, aber nicht mit dem Befehl interagieren. Manchmal müssen Sie etwas in den Befehl eingeben, wenn Sie beispielsweise einen Systembenutzer hinzufügen, um den aktuellen Benutzer in den Root-Benutzer zu ändern. Der Befehl su muss das Root-Passwort in die Befehlszeile eingeben. In diesem Fall ist es offensichtlich nicht möglich, die oben genannte Methode anzuwenden.
Die Funktion popen() öffnet eine Prozesspipe, um den angegebenen Befehl auszuführen, und gibt ein Dateihandle zurück, das gelesen und geschrieben werden kann. Der Rückgabewert ist derselbe wie bei der Funktion fopen() und gibt einen Dateizeiger zurück. Sofern nicht ein einzelner Modus zum Öffnen verwendet wird (Lesen oder Schreiben), muss er mit der Funktion pclose() geschlossen werden. Dieser Zeiger kann mit fgets(), fgetss(), fwrite() aufgerufen werden. Bei einem Fehler wird FALSE zurückgegeben.
<?php
echo `dir`;
?>
2. Bezüglich Sicherheitsfragen:
Da PHP grundsätzlich für WEB verwendet wird Bei der Programmentwicklung ist Sicherheit zu einem wichtigen Aspekt geworden, den die Menschen berücksichtigen.
Also haben die Entwickler von PHP eine Tür zu PHP hinzugefügt: den abgesicherten Modus.
Setzen Sie „safe_mode = On“ in php.ini
如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
执行外部命令
在打开文件时有些限制
连接MySQL数据库
基于HTTP的认证
在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP 是加上–with-exec-dir选项来指定,默认是/usr/local/php/bin。
当你使用这些函数来执行系统命令时,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。
三、关于超时问题
当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出至其他文件,再另行读取文件,这样可以显著提高程序执行的效率。
如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是在等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:
<?php system("/usr/local/bin/order_proc > /tmp/abc "); ?>
但我调用的DOS命令需要几分钟的时间,而且为了批处理不能简单的把结果写入文件了事,要顺序执行以下的程序
PHP设置了调用系统命令的时间限制,如果调用命令超时,虽然这个命令还是会被执行完,但PHP没有得到返回值,被终止了(最可恨的是,不显示任何错误)
修改php.ini并重启Apache以允许系统命令运行更长的时间
max_execution_time = 600
四、关于PHP运行linux环境中命令出现的问题
php一般是以apache用户身份去执行的,也可能是www用户,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的权限,而apache属于这个组就可以改写该目录下所有文件的权限。
例如:chown www:www dirName
这样dirName目录才能被php所控制
注意:改apache/php的运行用户方法不安全
另外即使文件或目录已经是www,php的安全设置也都照顾到,一些自己安装linux的命令仍然可能无法运行,例如我曾经安装的ffmpeg软件,原因就是linux的运行权限问题,即使ffmpeg有www权限设置,但由于ffmpeg所依赖的库文件是不允许www用户运行,所以php运行此程序仍然会报127或126错误,通过 ldd 命令可以查看ffmpeg命令依赖的库情况。
这个时候就必须对ffmpeg的依赖库经行设置。具体方法属于linux管理中的话题,这里不就讨论了。
以上就是本文的全部内容,希望对大家的学习有所帮助。
相关推荐:
Das obige ist der detaillierte Inhalt vonPHP-Methode zum Ausführen externer Befehle unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!