Les scénarios d'utilisation des quatre fonctions PHP shell_exec, exec, passthru et system

不言
Libérer: 2023-03-25 09:06:02
original
3235 Les gens l'ont consulté

Cet article présente principalement les scénarios d'utilisation des quatre fonctions PHP shell_exec, exec, passthru et system. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

.

peut exécuter des commandes associées du système d'exploitation. Je pense qu'un scénario d'application consiste à démarrer un autre processus en arrière-plan pour exécuter un contenu fastidieux sans l'afficher. les résultats au premier plan, ce qui est un peu similaire aux tâches planifiées, il peut également remplacer les files d'attente dans des scénarios simples. Il existe par exemple un fichier abc.php, qui contient des informations liées à l’envoi d’emails, ce qui est relativement chronophage. Dans d'autres fichiers, après avoir traité la logique normale, je veux envoyer un e-mail, mais je ne veux pas me soucier de savoir si l'e-mail réussit ou non. Exécutez-le simplement, c'est tout :

//正常逻辑
...
//处理费时的
exec('php abc.php  > /dev/null &');
// 或者
exec('php abc.php | at now');
//继续走你
...
Copier après la connexion
<. 🎜> Quelque chose comme ça, ce qui précède concerne uniquement Linux, et il peut y avoir des problèmes d'autorisation ou de chemin. Quant à Windows, d'autres fonctions peuvent être nécessaires pour le gérer.

Explication détaillée des commandes système appelées par exec, system et autres fonctions en PHP

Fonctions intégrées de PHP exec et system peut appeler des commandes système (commande shell), bien sûr, il existe également des fonctions passthru, escapeshellcmd et d'autres.


Dans de nombreux cas, utiliser les fonctions exec, system et autres de php pour appeler des commandes système peut nous aider à terminer notre travail mieux et plus rapidement. Par exemple, exec m'a beaucoup aidé lorsque je traitais par lots des fichiers .rar il y a deux jours.

Aujourd'hui, je vais trier les fonctions du système d'appel couramment utilisées et partager mon expérience avec tout le monde.

Remarque : Si vous souhaitez utiliser ces deux fonctions, le mode sans échec dans php.ini doit être désactivé, sinon php ne vous permettra pas d'appeler des commandes système pour des raisons de sécurité.

Tout d'abord, jetons un œil à l'explication de ces deux fonctions dans le manuel PHP :

exec --- exécuter des programmes externes

Syntaxe : string exec ( commande string [, array &output [ , int &return_var]] )

 

analyse de la fonction exécutable

 syntaxe exécutable : string exec(string command , string [array], int [return_var]);

 exec valeur de retour : String

Description du paramètre Exec

 Commande – la commande à exécuter

Array - Est la valeur de sortie

 return_var - est la valeur de retour 0 ou 1. Si 0 est renvoyé, le l'exécution est réussie, et si 1 est renvoyé, l'exécution échoue.

 échec de l'exécution, plan de débogage

  一个技巧就是使用管道命令, 使用 2>&1, 命令就会输出shell执行时的错误到$output变量, 输出该变量即可分析。

  如:

  exec('convert a.jpg b.jpg', $output, $return_val);

  改为:

  exec('convert a.jpg b.jpg 2>&1', $output, $return_val);

  print_r($output);

  说明 :

  exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。

  如果有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 如果数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,如果你不想要此函数附加元素的话,你可以在传递此数组给exec( )之前呼叫unset( )。

  如果有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。

  注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。

  注意 : 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。

  system --- 执行外部程式并且显示输出

  语法 : string system ( string command [, int &return_var] )

  说明 :

  system( )执行给予的命令command,并且输出结果。如果有给予参数return_var,则执行命令的状态码将会写到这个变量。

  注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。

  注意 : 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。

  如果PHP是运作成伺服器模组,在输出每一行后,system( )会试着自动地清除web伺服器的输出缓冲。

  成功则传回命令的最后一行,失败则传回false。

  如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。

  这二个都是用来调用系统shell命令,

  不同点:

  exec可以把执行的结果全部返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败

  systerm不需要提供$output函数,他是直接把结果返回出来,同样$return_var是执行的状态码 0为成功 1为失败

exec示例:

  <?php  
        $a = exec("dir",$out,$status);  
        print_r($a);  
        print_r($out);  
        print_r($status);  
    ?>
Copier après la connexion
<code class="hljs bash" style="padding:10px;background-color:rgb(63,63,63);color:rgb(220,220,220);font-size:13px;line-height:1.4;font-family:Menlo, Monaco, Consolas, &#39;Courier New&#39;, monospace;"><?php    
    <span class="hljs-variable" style="color:rgb(239,220,188);">$a</span> = <span class="hljs-built_in" style="color:rgb(204,147,147);">exec</span>(<span class="hljs-string" style="color:rgb(204,147,147);">"dir"</span>,<span class="hljs-variable" style="color:rgb(239,220,188);">$out</span>,<span class="hljs-variable" style="color:rgb(239,220,188);">$status</span>);    
    <span class="hljs-built_in" style="color:rgb(204,147,147);">print</span>_r(<span class="hljs-variable" style="color:rgb(239,220,188);">$a</span>);    
    <span class="hljs-built_in" style="color:rgb(204,147,147);">echo</span> <span class="hljs-string" style="color:rgb(204,147,147);">"<br>-----------------------------------------------------<br>"</span>;  
    <span class="hljs-built_in" style="color:rgb(204,147,147);">echo</span> <span class="hljs-string" style="color:rgb(204,147,147);">"<pre class="brush:php;toolbar:false">"</span>;  
    //<span class="hljs-built_in" style="color:rgb(204,147,147);">print</span>_r(<span class="hljs-variable" style="color:rgb(239,220,188);">$out</span>);   
    var_dump(<span class="hljs-variable" style="color:rgb(239,220,188);">$out</span>);  
    <span class="hljs-built_in" style="color:rgb(204,147,147);">echo</span> <span class="hljs-string" style="color:rgb(204,147,147);">"
"; echo "
-----------------------------------------------------
"
; print_r($status); ?>
Copier après la connexion

system示例:

    <?php  
        $a = system("dir",$out);  
        print_r($a);  
        print_r($out);  
    ?>
Copier après la connexion
<code class="hljs xml" style="padding:10px;background-color:rgb(63,63,63);color:rgb(220,220,220);
font-size:13px;
line-height:1.4;
font-family:Menlo, Monaco, Consolas, &#39;Courier New&#39;, monospace;"><span class="php"><span class="hljs-meta" style="color:rgb(127,159,127);"><span class="php"><span class="hljs-meta"><?php</span></span></span><span class="php">   
    $a = system(</span><span class="hljs-string" style="color:rgb(204,147,147);"><span class="php"><span class="hljs-string" style="color:rgb(204,147,147);">"dir"</span></span></span><span class="php">,$out);   
    </span><span class="hljs-keyword" style="color:rgb(227,206,171);"><span class="php"><span class="hljs-keyword" style="color:rgb(227,206,171);">echo</span></span></span><span class="php"> </span><span class="hljs-string" style="color:rgb(204,147,147);"><span class="php"><span class="hljs-string" style="color:rgb(204,147,147);">"<pre class="brush:php;toolbar:false">"</span></span></span><span class="php">;  
    </span><span class="hljs-comment" style="color:rgb(127,159,127);"><span class="php"><span class="hljs-comment" style="color:rgb(127,159,127);">//print_r($a); </span></span></span><span class="php">  
    var_dump($a);  
    </span><span class="hljs-keyword" style="color:rgb(227,206,171);"><span class="php"><span class="hljs-keyword" style="color:rgb(227,206,171);">echo</span></span></span><span class="php"> </span><span class="hljs-string" style="color:rgb(204,147,147);"><span class="php"><span class="hljs-string" style="color:rgb(204,147,147);">"
"; echo "
-----------------------------------------------------
"
; print_r($out); ?>
Copier après la connexion

 大家可以运行一下看效果

PHP执行系统外部命令:exec()、passthru()、system()、shell_exec()

在php开发网站中,经常需要执行系统外部命令。php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()。下面一一介绍。在开始前,先检查下php配置文件php.ini中是有禁止这是个函数。找到 disable_functions,配置如下:

disable_functions =

如果“disable_functions=”后面有接上面四个函数,将其删除。默认php.ini配置文件中是不禁止你调用执行外部命令的函数的。

方法一:exec()

function exec(string $command,array[optional] $output,int[optional] $return_value)
Copier après la connexion

php代码:

<?php
        echo exec("ls",$file);
        echo "</br>";
        print_r($file);
?>
Copier après la connexion

执行结果:

test.php
Array( [0] => index.php [1] => test.php)
Copier après la connexion

知识点:

exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一 行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空 这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

方法二:passthru()

function passthru(string $command,int[optional] $return_value)
Copier après la connexion

代码:

<?php
        passthru("ls");
?>
Copier après la connexion

执行结果:

index.phptest.php
Copier après la connexion

知识点:

passthru与system的区别,passthru直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,不返回任何值,且其可以输出二进制,比如图像数据。

方法三:system()

function system(string $command,int[optional] $return_value)
Copier après la connexion

代码:

<?php
        system("ls /");
?>
Copier après la connexion

执行结果:

binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
Copier après la connexion

知识点:

system和exec的区别在于system在执行系统外部命令时,直接将结果输出到游览器,不需要使用 echo 或 return 来查看结果,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。

方法四:反撇号`和shell_exec()

shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体
Copier après la connexion

代码:

<?php
        echo `pwd`;
?>
Copier après la connexion

执行结果:

/var/www/html
Copier après la connexion

相关推荐:

PHP正则匹配日期和时间(时间戳转换)的实例代码


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal