Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Стартиране на PHP скрипт от команден ред
  1. Входни и изходни потоци
     
Автор  plamenSm (30.03.2008 13:09)  съобщение до автора
Погледнат  1739 пъти  добави към любими
Оценка  добави коментар
Гласове  1  изпрати на приятел
Коментари  (0)  абонирай се за PHP
    Страница 1 / 1

 



PHP е чудесен език за бързо разработване на WEB приложения със сравнително малко писане на код. Това е известно на повечето от нас. По-малко известно обаче е, че PHP скрипт може да се стартира и от команден ред, подобно на всяка друга програма написана например на C, C++, Java и други. Вероятно бихте си задали въпроса защо е необходимо това. Нали преди всичко ние използваме PHP заедно с HTML, CSS, JavaScript, графика и други за да разработваме WEB приложения.


Защо е необходимо да се стартира PHP скрипт от команден ред?

Освен създаването на WEB страници с PHP скрипт който се активира по заявка от браузъра на посетителя, в едно голямо WEB приложение има и много други процеси, които трябва да работят във фонов режим. Процесите от този вид може да работят дълго време – от няколко минути до много часове.

Например разпращането на новини по e-mail до всички регистрирани потребители в сайта. Можем ли да направим това, като стартираме скрипта по обичайния начин чрез обръщение от браузър? – Да разбира се. Но този вариянт би работил нормално, ако имаме регистрирани няколко стотин потребители. Какво обаче ще стане, когато потребителите са например десетки или стотици хиляди? Нормално един PHP скрипт има максимално време за изпълнение в рамките на което трябва да върне резултат. Това време е известно под името „maximum execution time” и след изтичането му, ако скрипта не е върнал резултат, WEB сървърът автоматично прекратява изпълнението му.

Максималното време за изпълнение зависи от настрйките на WEB сървъра, също така може да се задава и в самия скрипт, но понякога е невъзможно да определим дори приблизително необходимото време. В разгледания пример, ако maximum execution time е настроено на 5 минути (типична стойност), скриптът ще изпрати само част от писмата, примерно няколко хиляди преди да бъде прекъснат.

Все пак възможно ли е да се реши проблема? – Да, тук именно е необходимо използване на скрипт, който се стартира от команден ред.

За разлика от скриптовете активирани чрез HTTP заявка, стартираните от команден ред скриптове нямат лимит от време за изпълнение.


Да започнем с един прост пример

Как се пишат скриптовете, които планираме да стартираме от комаден ред? Лесно ли е както тези, които се стартират чрез заявка от браузър? Да, можем да създадем такъв скрипт по същия начин, но има някои особености. Преди всичко трябва да помним, че изхода от скрипта няма да се праща на браузър, а ще се изведе в DOS / Shell prompt. Това означава, че не трябва да използваме никакви HTML тагове в изхода. Например за преминаване на нов ред вместо "<BR>" трябва да използваме "n". Следва кода на елементарен PHP скрипт, който извежда „Hello World!”.

CODE
1
2
3
<?php
print "Hello World!";
?>

Ако запишем този код във файл helloworld.php, можем да го стартираме от комаднен ред с командата „php helloworld.php”


Входни и изходни потоци

Вместо „print” и „echo”, можем да използваме стандартния изходен поток, който е дефиниран в CLI версията на PHP. Следващите редове показват три входно/изходни потока в PHP, които могат да се използват за достъп до стандартните входно изходни устройства, чрез функциите за работа със файлове.

php://stdin (read)
php://stdout (write)
php://stderr (write)

Тези потоци са дефинирани като константи с имена STDIN, STDOUTи STDERRв PHP4.3.0 CLI и следващите версии. (Запознатите с програмирането на C/C++ вероятно са забелязали приликата).


Сега да напишем helloworld.php като изпозваме STDOUT:

CODE
1
2
3
<?php
fwrite(STDOUT, "Hello World!");
?>

Тъй като тези потоци се третират като файлове, можем да използваме функциите за четене/запис от/във файл. А именно: fopen(), fread() и fwrite(). Още за получаване на отговор от потребителя (чрез клавиатурата), може да се използва STDIN с функциите: fgets(), fread(), fscanf() or fgetc().


За пример ще напишем малък скрипт, който кара потребителя да въведе името си, след което извежда „Welcome <име>”:

CODE
1
2
3
4
5
<?php
fwrite(STDOUT, “Please enter your namen);
$name = fgets(STDIN);
fwrite(STDOUT, "Welcome $name");
?>

Третият поток STDERR е предназначен за отделяне на нормалния изход от съобщенията за грешки.

В следващия пример скриптът отваря файл, прочита съдържанието му, след което затваря файла. В скрипта е дефинирана и регистрирана функция за обработка на грешки (ErrorHandler), която записва съобщението за грешката в потока STDERR.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
set_error_handler("ErrorHandler");

function ErrorHandler($errno, $errstr, $errfile, $errline)
{
   
fwrite(STDERR,"$errstr in $errfile on $errlinen");
}

$fp = fopen("demo.txt","r");
$str = fread($fp,filesize("demo.txt"));
fclose($fp);
fwrite(STDOUT, "Task completed successfully!");
?>

Ако файлът demo.txt не съществува, ще бъде изведено следното съобщение:

fopen(demo.txt): failed to open stream: No such file or directory in D:demotmperror.php on 10
filesize(): stat failed for demo.txt in D:demotmperror.php on 11
fread(): supplied argument is not a valid stream resource in D:demotmperror.php on 11
fclose(): supplied argument is not a valid stream resource in D:demotmperror.php on 12
Task completed successfully!

Ако не искаме да показваме на крайния потребител съобщенията за грешка, можем да ги пренасочим към файл:

php error.php 2> error.log

Сега потребителят ще вижда само нормалния изход, а именно:

Task completed successfully!

Ако има грешки, те ще се записват във файл error. log в директорията, където е стартиран скриптът. Номерацията на изходните потоци при пренасочване на изхода чрез комадния ред и символа ‘>’ е: 1 – STDOUT; 2 – STDERR (В горния пример „2>” пренасочва само STDERR).


В заключение

Сега вече имате основни познания за създаване и стартиране на PHP скрипт от команден ред. Целта на урока е да покаже съществуването на тази възможност и да даде основни знания за създаване на по-сложни скриптове. Както споменахме в началото, голямото предимство на тази техника е, че скриптът може да се изпълнява неограничено дълго време.


Източник: macronimous.com



   


Ключови думи: PHP стартиране на скрипт


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008