passthru

(PHP 4, PHP 5)

passthru — Execute an external program and display raw output

Описание

void passthru ( string $command [, int &$return_var ] )

The passthru() function is similar to the exec() function in that it executes a command . This function should be used in place of exec() or system() when the output from the Unix command is binary data which needs to be passed directly back to the browser. A common use for this is to execute something like the pbmplus utilities that can output an image stream directly. By setting the Content-type to image/gif and then calling a pbmplus program to output a gif, you can create PHP scripts that output images directly.

Список параметров

command

The command that will be executed.

return_var

If the return_var argument is present, the return status of the Unix command will be placed here.

Возвращаемые значения

Эта функция не возвращает значения после выполнения.

Примечания

Внимание

Если вы собираетесь передавать функции данные, отправленные пользователем, вы должны использовать функции escapeshellarg() или escapeshellcmd() для того, чтобы обезопасить исполнение команд.

Замечание: Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

Замечание: В случае работы в безопасном режиме, вы можете запускать что-либо только в пределах safe_mode_exec_dir. В настоящее время, использование .. в пути запрещено

Внимание

В случае работы в безопасном режиме, все слова, следующие за начальной командой, рассматриваются как единый аргумент. То есть echo y | echo x будет работать как echo "y | echo x".

Коментарии

The documention does not mention that passthru() will only display standard output and not standard error.

If you are running a script you can pipe the STDERR to STDOUT by doing 

exec 2>&1

Eg. the script below will actually print something with the passthru() function...

#!/bin/sh
exec 2>&1
ulimit -t 60
cat nosuchfile.txt
2002-01-30 09:35:54
http://php5.kiev.ua/manual/ru/function.passthru.html
passthru() seems absolutely determined to buffer output no matter what you do, even with ob_implicit_flush().  The solution seems to be to use popen() instead.
2003-06-03 23:41:27
http://php5.kiev.ua/manual/ru/function.passthru.html
Автор:
Remember to use the full path (IE '/usr/local/bin/foo' instead of 'foo') when using passthru, otherwise you'll get an exit code of 127 (command not found).
2004-12-14 10:21:39
http://php5.kiev.ua/manual/ru/function.passthru.html
Regarding swbrown's comment...you need to use an output buffer if you don't want the data displayed.

For example:
ob_start();
passthru("<i>command</i>");
$var = ob_get_contents();
ob_end_clean(); //Use this instead of ob_flush()

This gets all the output from the command, and exits without sending any data to stdout.
2005-03-02 16:50:50
http://php5.kiev.ua/manual/ru/function.passthru.html
Zak Estrada
14-Dec-2004 11:21 
Remember to use the full path (IE '/usr/local/bin/foo' instead of 'foo') when using passthru, otherwise you'll get an exit code of 127 (command not found).

Remember, you'll also get this error if your file does not have executable permission.
2005-03-09 01:33:55
http://php5.kiev.ua/manual/ru/function.passthru.html
If you are using passthru() to download files (for dynamically generated content or something outside webserver root) using similar code:

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"myfile.zip\"");
header("Content-Length: 11111");
passthru("cat myfile.zip",$err);

and your download goes fine, but subsequent downloads / link clicks are screwed up, with headers and binary data being all over the website, try putting

exit();

after the passthrough. This will exit the script after the download is done and will not interfere with any future actions.
2005-06-23 16:33:35
http://php5.kiev.ua/manual/ru/function.passthru.html
Thought it might beuseful to note the passthru seems to supress error messages whilst being run in Dos on Windows (test on NT).

To show FULL raw output including errors, use system().
2005-08-09 10:52:56
http://php5.kiev.ua/manual/ru/function.passthru.html
Автор:
I dunno if anyone else might find this useful, but when I was trying to use the passthru() command on Suse9.3 I was having no success with the command:

$command = 'gdal_translate blahahahaha';

passthru($command);

It only worked once I put:

$command = '/usr/bin/local/gdal_translate blalalala';

passthru($command);
2005-12-08 13:24:35
http://php5.kiev.ua/manual/ru/function.passthru.html
I wrote function, that gets proxy server value from the Internet Explorer (from
registry). It was tested in Windows XP Pro

(Sorry for my English)

<?php
function getProxyFromIE()
{
       
exec("reg query \"HKEY_CURRENT_USER\Software\Microsoft".
       
"\Windows\CurrentVersion\Internet Settings\" /v ProxyEnable",
       
$proxyenable,$proxyenable_status);

       
exec("reg query \"HKEY_CURRENT_USER\Software\Microsoft".
       
"\Windows\CurrentVersion\Internet Settings\" /v ProxyServer",
       
$proxyserver);

        if(
$proxyenable_status!=0)
        return 
false#Can't access the registry! Very very bad...
       
else
        {
       
$enabled=substr($proxyenable[4],-1,1);
        if(
$enabled==0)
        return 
false;
        else
        {
       
$proxy=ereg_replace("^[ \t]{1,10}ProxyServer\tREG_SZ[ \t]{1,20}","",
       
$proxyserver[4]);

        if(
ereg("[\=\;]",$proxy))
        {
             
$proxy=explode(";",$proxy);
             foreach(
$proxy as $i => $v)
             {
                   if(
ereg("http",$v))
                   {
                   
$proxy=str_replace("http=","",$v);
                   break;
                   }
             }
             if(@!
ereg("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:".
             
"[0-9]{1,5}$",$proxy))
             return 
false;
             else
             return 
$proxy;
        }
        else
        return 
$proxy;
        }

        }
}
?>
Note, that this function returns FALSE if proxy is disabled in Internet
Explorer. This function returns ONLY HTTP proxy server.

Usage:
<?php
$proxy
=getProxyFromIE();
if(!
$proxy)
echo 
"Can't get proxy!";
else
echo 
$proxy;
?>
2006-01-03 07:51:52
http://php5.kiev.ua/manual/ru/function.passthru.html
Note to Paul Giblock: the command *is* run through the shell.
You can verify this on any Linux system with

<?php
passthru 
('echo $PATH');
?>

You'll get the content of the PATH environment variable, not the string $PATH.
2007-11-22 14:17:54
http://php5.kiev.ua/manual/ru/function.passthru.html
Автор:
If you have chrooted apache and php, you will also want to put /bin/sh into the chrooted environment. Otherwise, the exec() or passthru() will not function properly, and will produce error code 127, file not found.
2008-07-29 12:48:57
http://php5.kiev.ua/manual/ru/function.passthru.html
PHP's program-execution commands fail miserably when it comes to STDERR, and the proc_open() command doesn't work all that consistently in non-blocking mode under Windows.

This command, although useful, is no different. To form a mechanism that will see/capture both STDOUT and STDERR output, pipe the command to the 'tee' command (which can be found for Windows), and wrap the whole thing in output buffering.

Dustin Oprea
2010-11-29 15:00:13
http://php5.kiev.ua/manual/ru/function.passthru.html
I was trying to implement a system that allows running arbitrary CLI commands with parameters, but I kept running into the issues with user prompts from the command as they would let execution hang. The solution is simple: just use passthru() as it outputs everything and correctly handles user prompts out of the box.
2019-09-03 13:57:09
http://php5.kiev.ua/manual/ru/function.passthru.html
To capture the output of a command in a string without using output buffer functions, use shell_exec()
2022-09-12 12:26:12
http://php5.kiev.ua/manual/ru/function.passthru.html
if you have problems with passthru("docker-compose ...bash") losing interactive shell size information, try using proc_open instead, for some reason docker-compose bash knows the size of the outer terminal when i use use proc_open, but loses that information when i use passthru,

eg i replaced
<?php
passthru
("docker-compose -f docker-compose.yml bash",$ret);
?>
with
<?php
$empty1
=array();
$empty2=array();
$proc=proc_open("docker-compose -f docker-compose.yml bash",$empty1,$empty2 );
$ret proc_close($proc);
?>

and suddenly docker-compose bash knew my terminal size :)
2022-10-06 19:32:22
http://php5.kiev.ua/manual/ru/function.passthru.html

    Поддержать сайт на родительском проекте КГБ