Php вызов только от скрипта

exec

If the output argument is present, then the specified array will be filled with every line of output from the command. Trailing whitespace, such as \n , is not included in this array. Note that if the array already contains some elements, exec() will append to the end of the array. If you do not want the function to append elements, call unset() on the array before passing it to exec() .

If the result_code argument is present along with the output argument, then the return status of the executed command will be written to this variable.

Return Values

The last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

Returns false on failure.

To get the output of the executed command, be sure to set and use the output parameter.

Errors/Exceptions

Emits an E_WARNING if exec() is unable to execute the command .

Throws a ValueError if command is empty or contains null bytes.

Changelog

Version Description
8.0.0 If command is empty or contains null bytes, exec() now throws a ValueError . Previously it emitted an E_WARNING and returned false .

Examples

Example #1 An exec() example

// outputs the username that owns the running php/httpd process
// (on a system with the «whoami» executable in the path)
$output = null ;
$retval = null ;
exec ( ‘whoami’ , $output , $retval );
echo «Returned with status $retval and output:\n» ;
print_r ( $output );
?>

The above example will output something similar to:

Returned with status 0 and output: Array ( [0] => cmb )

Notes

When allowing user-supplied data to be passed to this function, use escapeshellarg() or escapeshellcmd() to ensure that users cannot trick the system into executing arbitrary commands.

Note:

If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.

Note:

On Windows exec() will first start cmd.exe to launch the command. If you want to start an external program without starting cmd.exe use proc_open() with the bypass_shell option set.

See Also

  • system() — Execute an external program and display the output
  • passthru() — Execute an external program and display raw output
  • escapeshellcmd() — Escape shell metacharacters
  • pcntl_exec() — Executes specified program in current process space
  • backtick operator

User Contributed Notes 20 notes

This will execute $cmd in the background (no cmd window) without PHP waiting for it to finish, on both Windows and Unix.

function execInBackground ( $cmd ) <
if ( substr ( php_uname (), 0 , 7 ) == «Windows» ) <
pclose ( popen ( «start /B » . $cmd , «r» ));
>
else <
exec ( $cmd . » > /dev/null &» );
>
>
?>

(This is for linux users only).

We know now how we can fork a process in linux with the & operator.
And by using command: nohup MY_COMMAND > /dev/null 2>&1 & echo $! we can return the pid of the process.

This small class is made so you can keep in track of your created processes ( meaning start/stop/status ).

You may use it to start a process or join an exisiting PID process.

// You may use status(), start(), and stop(). notice that start() method gets called automatically one time.
$process = new Process ( ‘ls -al’ );

// or if you got the pid, however here only the status() metod will work.
$process = new Process ();
$process . setPid ( my_pid );
?>

// Then you can start/stop/ check status of the job.
$process . stop ();
$process . start ();
if ( $process . status ()) echo «The process is currently running» ;
>else echo «The process is not running.» ;
>
?>

/* An easy way to keep in track of external processes.
* Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it.
* @compability: Linux only. (Windows does not work).
* @author: Peec
*/
class Process private $pid ;
private $command ;

public function __construct ( $cl = false ) if ( $cl != false ) $this -> command = $cl ;
$this -> runCom ();
>
>
private function runCom () $command = ‘nohup ‘ . $this -> command . ‘ > /dev/null 2>&1 & echo $!’ ;
exec ( $command , $op );
$this -> pid = (int) $op [ 0 ];
>

public function setPid ( $pid ) $this -> pid = $pid ;
>

public function getPid () return $this -> pid ;
>

public function status () $command = ‘ps -p ‘ . $this -> pid ;
exec ( $command , $op );
if (!isset( $op [ 1 ]))return false ;
else return true ;
>

public function start () if ( $this -> command != » ) $this -> runCom ();
else return true ;
>

public function stop () $command = ‘kill ‘ . $this -> pid ;
exec ( $command );
if ( $this -> status () == false )return true ;
else return false ;
>
>
?>

Источник

Выполнить скрипт PHP из другого скрипта PHP

Как я могу заставить свой сервер запускать php script путем запуска его вручную с помощью php? В основном у меня есть довольно большой файл cronjob, который запускается каждые 2 часа, но я хочу, чтобы иметь возможность запускать файл вручную самостоятельно, не дожидаясь его загрузки (я хочу, чтобы это было сделано на стороне сервера). EDIT: Я хочу выполнить файл из файла php. Не в командной строке.

Ответы были неверны только потому, что вы не включили важные вопросы в свой вопрос. Учитывая предоставленные вами данные, ответы на 100% правильные. Теперь, когда вы описали, что вы на самом деле пытаетесь сделать, ответы улучшатся. Очень просто, у вас нет причин для недовольства. Люди пытаются помочь.

10 ответов

Вы можете вызвать PHP script вручную из командной строки

hello.php Command line: php hello.php Output: hello world! 

EDIT OP отредактировал вопрос, чтобы добавить критическую деталь: script должен быть выполнен другим script.

Существует несколько подходов. Сначала и проще всего, вы можете просто включить файл. Когда вы включаете файл, код внутри «выполняется» (фактически, интерпретируется). Любой код, который не находится внутри функции или тела класса, будет обработан немедленно. Взгляните на документацию для include (docs) и/или require (docs) (примечание: include_once и require_once связаны друг с другом, но различны по-важному. Посмотрите документы, чтобы понять разницу). Ваш код будет выглядеть следующим образом:

 include('hello.php'); /* output hello world! */ 

Вторым и немного более сложным является использование shell_exec (docs). С помощью shell_exec вы вызовете двоичный код php и передадите искомый script в качестве аргумента. Ваш код будет выглядеть так:

$output = shell_exec('php hello.php'); echo "
$output

"; /* output hello world! */

Наконец, и самое сложное, вы можете использовать библиотеку CURL для вызова файла, как если бы он запрашивался через браузер. Ознакомьтесь с документацией библиотеки CURL здесь: http://us2.php.net/manual/en/ref.curl.php

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.myDomain.com/hello.php"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) $output = curl_exec($ch); curl_close($ch); echo "
$output

"; /* output hello world! */

Документация для используемых функций

  • Командная строка: http://php.net/manual/en/features.commandline.php
  • include : http://us2.php.net/manual/en/function.include.php
  • require : http://us2.php.net/manual/en/function.require.php
  • shell_exec : http://us2.php.net/manual/en/function.shell-exec.php
  • curl_init : http://us2.php.net/manual/en/function.curl-init.php
  • curl_setopt : http://us2.php.net/manual/en/function.curl-setopt.php
  • curl_exec : http://us2.php.net/manual/en/function.curl-exec.php
  • curl_close : http://us2.php.net/manual/en/function.curl-close.php

Источник

Как запустить скрипт PHP только если сервер его вызывает

У меня есть PHP-скрипт, и это будет выполняться только в том случае, если сам сервер называет его. Например: form(). Submit запускает запрос AJAX для отправки данных формы. Я не хочу разрабатывать хэш-декодирование и кодировать систему для подтверждения, если запрос разрешен или нет. Есть ли простая возможность проверить, работает ли «сервер для запуска сценария» или клиент хочет запустить скрипт? Если нет, я могу использовать.htpasswd

Поместите его за пределы документа, и он будет фактически недоступен для пользователя. Только сервер сможет запустить его.

4 ответа

Вы можете сделать это с помощью следующих шагов;

1) Поместите ваш php-скрипт вне вашего веб-документа root как /usr/local/phpscripts/

2) Запустите этот скрипт из своего кода;

$output = shell_exec('php /usr/local/phpscripts/your_script.php'); 

Делая это, только ваш сервер может вызвать ваш скрипт. Веб-пользователь не может получить доступ к этому скрипту php для выполнения

Если вы используете apache, вы можете поместить свои скрипты в папку и добавить файл htaccess (.htaccess) со следующим содержимым

Таким образом, когда пользователь пытается получить доступ к скрипту php напрямую, он получит только запрещенную страницу. Вы можете обращаться к файлам только с помощью include/require методов скрипта php, используемых на сервере.

Скрипты, доступные пользовательскому агенту, должны находиться внутри docroot, иначе они полностью недоступны. Предполагая, что это ваша структура проекта:

public_html/ |-- index.php src/ |-- somefile.php 

и если ваш корень документа установлен в каталог public_html (через конфигурацию vhost), файлы внутри src не могут быть доступны агентом пользователя. Поэтому только сервер может запускать их, требуя их в других сценариях.

Если вы хотите, чтобы ваш скрипт выполнялся при include() вы можете установить переменную в скрипте include() и проверить его в этом.

script2.php: (сценарий, который вы не хотите вызывать из браузера)

В противном случае, если вы хотите использовать сценарий только из командной строки:

добавьте эту строку в самом начале вашего скрипта:

[[email protected] html]# cat test.php [email protected] html]# php test.php cli 

Теперь вызов этого же скрипта из браузера:

Нет, это запрещает доступ к сценарию для чего-либо еще, кроме доступа к командной строке. Я отметил ваш комментарий как бесполезный, надеюсь, вы удалите его самостоятельно.

ОК !== , который я прочитал как === , мой плохой. Тем не менее, ответ не тот, о котором просил ОП. Это, в свою очередь, не позволит CGI запустить скрипт. Ограничивать его любым конкретным именем SAPI не рекомендуется, поскольку вы также можете получить «apache2filter» в качестве своего имени SAPI в Apache, и это определенно не будет работать Nginx или даже php-cli SAPI (встроенный веб-сервер PHP).

Источник

Читайте также:  Java log4j как подключить
Оцените статью