On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:
1: #!/usr/bin/php
2: #!/usr/bin/env php
3: #!/usr/bin/php -n
4: #!/usr/bin/php -ddisplay_errors=E_ALL
5: #!/usr/bin/php -n -ddisplay_errors=E_ALL
1. is the standard way to start a script. (compare "#!/bin/bash".)
2. uses "env" to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.
3. if you don't need to use env, you can pass ONE parameter here. For example, to ignore the system's PHP.ini, and go with the defaults, use "-n". (See "man php".)
4. or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it's too late: if your script has a parse error, it will silently die.
5. This will not (as of 2013) work on Linux. It acts as if the whole string, "-n -ddisplay_errors=E_ALL" were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.
Summary: use (2) for maximum portability, and (4) for maximum debugging.Употреба
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Употреба
Референца за `features.commandline.usage.php` со подобрена типографија и навигација.
Извршување на PHP датотеки
Постојат три различни начини за доставување на CLI SAPI со PHP код за извршување:
-
Кажете му на PHP да изврши одредена датотека.
$ php my_script.php $ php -f my_script.php
И двата начини (без разлика дали се користи -f прекинувач или не) ја извршуваат датотеката my_script.php. Имајте предвид дека нема ограничување за тоа кои датотеки можат да се извршуваат; особено, името на датотеката не е потребно да има
.phpextension. -
Поминете го PHP кодот за директно извршување на командната линија.
$ php -r 'print_r(get_defined_constants());'
Посебно внимание треба да се посвети на супституцијата на променливите на школката и употребата на наводници.
Забелешка:
Внимателно прочитајте го примерот: нема почетни или завршни ознаки! На -r прекинувачот едноставно не ги потреби, а нивното користење ќе доведе до грешка при парсирање.
-
Обезбедете го PHP кодот за извршување преку стандарден влез (
stdin).Ова дава моќна способност за динамично креирање PHP код и негово доставување до бинарниот, како што е прикажано во овој (фиктивен) пример:
$ some_application | some_filter | php | sort -u > final_output.txt
Како и со секоја школка апликација, PHP бинарниот прифаќа голем број аргументи; сепак, PHP скриптата може да прими и дополнителни аргументи. Бројот на аргументи што можат да се поминат на вашата скрипта не е ограничен од PHP (иако школката има ограничување за бројот на знаци што можат да се поминат, ова генерално не е веројатно да се достигне). Аргументите поминати на скриптата се достапни во глобалната низа $argv. Првиот индекс (нула) секогаш го содржи името на скриптата како што е повикана од командната линија. Имајте предвид дека, ако кодот се извршува ин-лајн користејќи го прекинувачот на командната линија -r, вредноста на $argv[0]
сокети, и го специфицира далечинскиот порт од кој се примаат податоците. Ако сокетот е поврзан-ориентиран, "Standard input code"; пред PHP 7.2.0, беше цртичка ("-") наместо тоа. Истото важи и ако кодот се извршува преку цевка од STDIN.
Втора глобална променлива, $argc, содржи број на елементи во $argv низата (not бројот на аргументите предадени на скриптата).
Сè додека аргументите што треба да се предадат на скриптата не започнуваат со - знак, нема ништо посебно за што треба да се внимава. Предавањето аргумент на скриптата што започнува со -
ќе предизвика проблеми бидејќи PHP толкувачот мисли дека тој мора сам да се справи со тоа, дури и пред извршувањето на скриптата. За да го спречите ова, користете го разделувачот на листата со аргументи --. По овој разделувач што го анализира PHP, секој следен аргумент се предава недопрен на скриптата.
# This will not execute the given code but will show the PHP usage
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# This will pass the '-h' argument to the script and prevent PHP from showing its usage
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
Сепак, на Unix системи постои друг начин за користење на PHP за скриптирање на школка: направете го првиот ред од скриптата да започнува со
#!/usr/bin/php (или што и да е патот до вашиот PHP CLI
бинарна програма ако е различно). Остатокот од датотеката треба да содржи нормален PHP код вообичаените PHP почетни и завршни ознаки. Откако ќе се постават соодветно атрибутите за извршување на датотеката (на пр. "chmod +x test"), скриптата може да се изврши како и секоја друга школка или перл скрипта:
Пример #1 Извршување на PHP скрипта како школка скрипта
#!/usr/bin/php
<?php
var_dump($argv);
?>Претпоставувајќи дека оваа датотека се вика test во тековната директорија, сега е можно да се направи следново:
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
Како што може да се види, во овој случај не е потребно посебно внимание при предавање на параметри што започнуваат со -.
PHP извршната програма може да се користи за извршување на PHP скрипти целосно независно од веб-серверот. На Unix системи, специјалната #! (или "shebang") првиот ред треба да се додаде на PHP скриптите за да може системот автоматски да каже која програма треба да ја изврши скриптата. На Windows платформи, можно е да се поврзе php.exe со опцијата двоен клик на .php екстензијата, или може да се создаде батч датотека за извршување на скрипти преку PHP. Специјалниот прв ред shebang за Unix не штети на Windows (бидејќи е форматиран како PHP коментар), така што може да се пишуваат крос-платформски програми со негово вклучување. Едноставен пример за пишување на PHP програма од командна линија е прикажан подолу.
Example #2 Script intended to be run from command line (script.php)
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
This is a command line PHP script with one option.
Usage:
<?php echo $argv[0]; ?> <option>
<option> can be some word you would like
to print out. With the --help, -help, -h,
or -? options, you can get this help.
<?php
} else {
echo $argv[1];
}
?>Горната скрипта вклучува прв ред Unix shebang за да покаже дека оваа датотека треба да се извршува од PHP. Работиме со CLI Пример #2 Скрипта наменета за извршување од командна линија (script.php) HTTP Пример #3 Batch датотека за извршување на PHP скрипта од командна линија (script.bat)
Програмата прво проверува дали има потребен еден аргумент (покрај името на скриптата, кое исто така се брои). Ако не, или ако аргументот беше --help, -help, -h or -?, се прикажува пораката за помош, користејќи $argv[0] за динамично печатење на името на скриптата како што е внесено во командната линија. Во спротивно, аргументот се испишува точно како што е примен.
За да се изврши горната скрипта на Unix, таа мора да биде извршна и да се повика едноставно како Пример #2 Скрипта наменета за извршување од командна линија (script.php) or script.php echothis. На Windows, може да се креира batch датотека слична на следната за оваа задача:
script.php -h
@echo OFF "C:\php\php.exe" script.php %*
Под претпоставка дека горната програма се вика script.phpФункциите CLI php.exe е во C:\php\php.exe, оваа batch датотека ќе ја изврши, предавајќи ги сите додадени опции: Пример #3 Бат-фајл за извршување на PHP скрипта од командна линија (script.bat) or script.bat echothis.
Погледнете исто така script.bat -h документација за екстензии за повеќе функции кои можат да се користат за подобрување на апликациите од командна линија во PHP.
На Windows, PHP може да се конфигурира да работи без потреба од внесување на C:\php\php.exe или .php
екстензија, како што е опишано во PHP од командна линија на Microsoft Windows.
Забелешка:
На Windows се препорачува PHP да се извршува под вистинска корисничка сметка. При извршување под мрежна услуга, одредени операции ќе откажат, бидејќи „Не е направена мапа помеѓу имињата на сметките и безбедносните идентификатори“.
Белешки од корисници 5 белешки
For Windows:
After the years I also have the fact that I have to use double quotation marks after php -r on Windows shell.
But in the Powershell you can use single or double quotation!Regarding shebang:
In both Linux and Windows, when you execute a script in CLI with:
php script.php
then PHP will ignore the very first line of your script if it starts with:
#!
So, this line is not only absorbed by the kernel when the script file is executable, but it is also ignored by the PHP engine itself.
However, the engine will NOT ignore the first #! line of any included files withing your "outer" script.php.
Any "shebang" line in an included script, will result in simply outputting the line to STDOUT, just as any other text residing outside a <?php ... ?> block.A gotcha when using #!/usr/bin/php at the start of the file as noted above:
if you originally edited the file on Windows and then attempt to use it on Unix, it won't work because the #! line requires a Unix line ending. Bash gives you the following error message if it has DOS line endings:
"bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory"
(In Emacs I used "CTRL-X ENTER f" then type "unix" and ENTER to convert)