ã»ãšãã©ã®å°é家ã«ãšã£ãŠãPHPã¯ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ã®äœæã«çå£ã«äœ¿çšãããèšèªã§ã¯ãªããããã«ã¯å€ãã®çç±ããããŸãã PHPã¯å
ã
ãWebãµã€ããäœæããããã®èšèªãšããŠéçºãããŸããããPHP 4.3以éã2002幎ã«CLIã¢ãŒãã
å
¬åŒã«ãµããŒããããããããã®ãããªãã®ã¯é·ããªããªããŸããã æ°å¹Žã®éã«ãBadooéçºè
ã¯PHPã§å€ãã®ã€ã³ã¿ã©ã¯ãã£ããªCLIãŠãŒãã£ãªãã£ãæ£åžžã«äœ¿çšããŠããŸãã
ãã®èšäºã§ã¯ãPHPã®CLIã¢ãŒãã§ã®çµéšãå
±æãã* nixã·ã¹ãã ã§å®è¡ããããšããæ¡ä»¶ã§ãPHPã§ã¹ã¯ãªãããäœæãã人ã«ããã€ãã®æšå¥šäºé
ã瀺ããŸãïŒãã ããã»ãšãã©ãã¹ãŠãWindowsã«ãåœãŠã¯ãŸããŸãïŒ ïŒ
æšå¥šäºé
äœæ¥é床
PHPã¯é
ãèšèªã§ãããšåºãä¿¡ããããŠããŸãããå®éã«ã¯ããã§ãã PHP CLIã®å Žåã次ã®2ã€ã®çç±ãããéããã¬ãŒã ã¯ãŒã¯ã䜿çšããã倧ããªPHPã©ã€ãã©ãªãŒã ãã䜿çšããããšããå§ãããŸãã
- CLIã¢ãŒãã§ã®include / requireã®å®è¡ã«ã¯ãåžžã«è§£æãšå®è¡ãå«ãŸããŸãã ãã®ã¢ãŒãã®ãã€ãã³ãŒãã¯ãã£ãã·ã¥ãããŸããïŒå°ãªããšãããã©ã«ãã§ã¯ïŒãããã¯ããã¹ãŠãWebãµãŒããŒã®äžã§éåžžã«é«éã«åäœããå Žåã§ããåæåã«å€ãã®æéããããããšãæå³ããŸãã
- Webãµã€ãã®ãŠãŒã¶ãŒã¯ãããŒãžãèªã¿èŸŒãããã«äžå®ã®æéåŸ
æ©ããããšã«æ
£ããŠããŸãïŒçŽ1ç§ãå Žåã«ãã£ãŠã¯ããå°ãããŠãŒã¶ãŒã¯ãããéåžžã«æ®éã«èªèããŸãïŒããCLIã«ã€ããŠãåãããšãèšããŸããïŒ100ããªç§ã®é
延ã§ãããé¡èã§ããã 1ç§ä»¥äžã§è¿·æã«ãªãããšããããŸãã
ç»é¢åºå
CLIã¢ãŒããšWebã¢ãŒãã§ã¯ãç»é¢ãžã®åºåã¯å€§ããç°ãªããŸãã Webã¢ãŒãã§ã¯ãåºåã¯éåžžãããã¡ãªã³ã°ãããŸã;ã¹ã¯ãªããã®å®è¡äžã¯ãŠãŒã¶ãŒã«äœã質åã§ããŸããã ã¯ã©ã¹ãšããŠæ¬ èœããŠããã®ã¯ããšã©ãŒã¹ããªãŒã ãžã®åºåã®æŠå¿µã§ãã CLIã¢ãŒãã§ã¯ãåœç¶ãHTMLåºåã¯åãå
¥ãããããé·ãè¡ã®åºåã¯éåžžã«æãŸãããããŸããã CLIã§ã¯ãããã©ã«ãã§echoã¯flushïŒïŒãåŒã³åºããŸãïŒè©³çŽ°ã¯
ããã«ãããŸã ïŒ-ããã¯ãããšãã°åºåããã¡ã€ã«ã«ãªãã€ã¬ã¯ããããå Žåã«ãæåã§flushïŒïŒãåŒã³åºãããšãå¿é
ããå¿
èŠããªããã䟿å©ã§ãã
ãŸããCLIã¹ã¯ãªããã®å ŽåãSTDOUTã§ã¯ãªãïŒãšã³ãŒã䜿çšããŠïŒãšã©ãŒãåºåããã®ãçã«ããªã£ãŠããŸãããã®ããã«ãããã°ã©ã åºåãä»ã®å ŽæïŒããšãã°ã/ dev / nullãŸãã¯grepïŒã«ãªãã€ã¬ã¯ããããŠãããŠãŒã¶ãŒã¯ããã¹ããèŠéããŸããçºçããå Žåã®ãšã©ãŒã ããã¯ã»ãšãã©ã®ãã€ãã£ã* nixã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ã®æšæºçãªåäœã§ãããSTDERRã¯äžèšã®çç±ããååšããŸãã PHPã§ã¯ãSTDERRã«æžã蟌ãããã«ãããšãã°ãfwriteïŒSTDERRã$ã¡ãã»ãŒãžïŒãŸãã¯error_logïŒ$ã¡ãã»ãŒãžïŒã䜿çšã§ããŸãã
ãªã¿ãŒã³ã³ãŒãã®äœ¿çš
æ»ãã³ãŒãã¯ãã³ãã³ããæåããå Žåã¯0ã§ããããã以å€ã®å Žåã¯0ã§ã¯ãªãæ°å€ã§ãã èŽåœçã§ãªããšã©ãŒã®å ŽåïŒããšãã°ã誀ã£ãã³ãã³ãã©ã€ã³åŒæ°ãæå®ãããå ŽåïŒã«1ã®æ»ãã³ãŒãããã䜿çšããã2-é倧ãªã·ã¹ãã ãšã©ãŒã®å ŽåïŒããšãã°ããããã¯ãŒã¯ãŸãã¯ãã£ã¹ã¯ãšã©ãŒã®å ŽåïŒã«æ»ãã³ãŒãã䜿çšãããŸãã éåžžã127ãŸãã¯255ãªã©ã®å€ã¯ãããã¥ã¡ã³ãã«åå¥ã«ç€ºãããŠããç¹å¥ãªå Žåã«äœ¿çšãããŸãã
ããã©ã«ãã§ã¯ãPHPã¹ã¯ãªãããåçŽã«çµäºãããšããã¹ãŠã®ã³ãã³ããæ£åžžã«æ©èœãã0ãè¿ããšæ³å®ãããŸããç¹å®ã®æ»ãã³ãŒãã§çµäºããã«ã¯ãexitïŒNUMïŒãæ瀺çã«åŒã³åºãå¿
èŠããããŸããNUMã¯æ»ãã³ãŒãã§ãïŒæåãããšã©ãŒã®å Žåã¯ç°ãªãæå³ãæã¡ãŸãïŒã
execïŒïŒãŸãã¯systemïŒïŒã§å®è¡ãããå€éšã³ãã³ããæåããªãã£ãããšãç解ããã«ã¯ã察å¿ããé¢æ°ã®ãã©ã¡ãŒã¿ãŒãšããŠå€æ°$ return_varãæž¡ãããŒãã«çãããã©ããã®å€ã確èªããå¿
èŠããããŸãã
泚æïŒ execïŒ 'some_cmd ... 2>ïŒ1'ã$ outputïŒãèšè¿°ããŠãšã©ãŒã$ outputã«åé¡ããå Žåã¯ãSTDOUTãšSTDERRãåé¢ããçç±ãç解ãããšã©ãŒã¹ããªãŒã ã®STDOUTïŒ2>ïŒ1ïŒãžã®æ瀺çãªãªãã€ã¬ã¯ããåé€ããããšããå§ãããŸãã ãã®ãããªãªãã€ã¬ã¯ãã¯ãèŠãããããã¯ããã«å°ãªãé »åºŠã§å¿
èŠã§ãã ïŒPHPã¹ã¯ãªããã§ïŒãã®äœ¿çšãå°ãæ£åœåãããå¯äžã®ã±ãŒã¹ã¯ãã³ãã³ãã®å®è¡çµæãWebããŒãžïŒCLIã§ã¯ãªãïŒïŒã«å°å·ããå¿
èŠãããããšã§ããçºçãããšã©ãŒãå«ããŸãïŒããããªããšãWebãµãŒããŒã®ãã°ã«èšé²ããããã / dev / nullïŒã
ã·ã¹ãã ã®çµã¿èŸŒã¿ã³ãã³ãã®äžã®ãå€è£
ã
åªããã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ã¯æšæºçãªæ¹æ³ã§åäœããå¿
èŠãããããŠãŒã¶ãŒã¯ãããPHPã§ããããšããç¥ããªããããããŸããã ãã®ããã* nix-systemsã¯ãPerl / Python / Rubyã§ã¹ã¯ãªãããå®è¡ããããšã«ã€ããŠå€ãã®äººãç¥ã£ãŠããã¡ã«ããºã ãæäŸããŸãããPHPã«ãåæ§ã«é©çšã§ããŸãã
ããšãã°ãPHPãã¡ã€ã«ã®å
é ã«ïŒïŒ/ Usr / bin / env phpãè¿œå ããŠæ¹è¡ããå Žåãå®è¡æš©éïŒchmod 755 myscript.phpïŒãä»äžãã.phpæ¡åŒµåãåé€ããŸãïŒåŸè
ã¯äžèŠã§ãïŒãä»ã®å®è¡å¯èœãã¡ã€ã«ïŒ./myscriptïŒãšåæ§ã«å®è¡ãããŸãã PATHå
ã®ã¹ã¯ãªããã䜿çšããŠãã£ã¬ã¯ããªãè¿œå ããããæšæºã®PATHãã£ã¬ã¯ããªã®1ã€ïŒããšãã°ã/ usr / local / binïŒã«ç§»åãããšãä»ã®ã·ã¹ãã ãŠãŒãã£ãªãã£ãšåæ§ã«ããmyscriptãã®åçŽãªã»ããã§ã¹ã¯ãªãããåŒã³åºãããšãã§ããŸãã
ã³ãã³ãã©ã€ã³åŒæ°ã®åŠç
ã»ãšãã©ã®çµã¿èŸŒã¿ã·ã¹ãã ãŠãŒãã£ãªãã£ãåŸãã³ãã³ãã©ã€ã³åŒæ°ã®åœ¢åŒã«ã¯åæããããã¹ã¯ãªãããšã¹ã¯ãªããã«åŸãããšããå§ãããŸãã
ééã£ãæ°ã®åŒæ°ãåãåã£ãå Žåã¯ãã¹ã¯ãªããã®ç°¡åãªãã«ããæžããŠãã ããã
åŒã³åºãããã¹ã¯ãªããã®ååã調ã¹ãã«ã¯ã$ argv [0]ã䜿çšããŸãã
if($argc != 2) {
ãã©ã°ã®åŠçã容æã«ããããã«ãgetoptïŒïŒã䜿çšã§ããŸãã GetoptïŒïŒã¯ãã³ãã³ãã©ã€ã³åŒæ°ãåŠçããããã®çµã¿èŸŒã¿é¢æ°ã®1ã€ã§ãã äžæ¹ãåŒæ°ã®äžéšãæåã§åŠçããããšã¯é£ãããããŸããã PHPã§ã¯ãããã¯é£ãããããŸããã ãã®ã¡ãœããã¯ãsshãŸãã¯sudoã®ã¹ã¿ã€ã«ã§åŒæ°ãåŠçããå¿
èŠãããå Žåã«å¿
èŠã«ãªãããšããããŸãïŒsudo -u nobody echo Hello worldã¯ãã³ãã³ãã®åã®-uãã©ã°ã®åŸã«æå®ããããŠãŒã¶ãŒnobodyããecho Hello worldãå®è¡ããŸãïŒã
ããé£ããã¬ãã«ã®æšå¥šäºé
CLIã®ãæ£ãããã·ã¹ãã ïŒïŒã®åŒã³åºã
systemïŒïŒã®å®è£
ã¯ããã§ã«
ããã«èšè¿°ãããŠã
ãŸã ã ãã€ã³ãã¯ãPHPã®æšæºã·ã¹ãã ïŒïŒã¯Cã®systemïŒïŒã®åŒã³åºãã§ã¯ãªããããããpopenïŒïŒã®ã©ãããŒã§ãããåŒã³åºãããã¹ã¯ãªããã®STDINãšSTDOUTããå°ç¡ãã«ãããããšã§ãã ãããé²ãã«ã¯ã次ã®æ©èœã䜿çšããå¿
èŠããããŸãã
ãã¡ã€ã«ã·ã¹ãã ãæäœãã
é©ããããšã«ããã¡ã€ã«ã®ååž°çãªåé€ïŒã³ããŒã移åïŒãç¬èªã«å®è£
ããã®ã§ã¯ãªããçµã¿èŸŒã¿ã®mvãrmãcpã³ãã³ãïŒWindowsã®å Žåã察å¿ããé¡äŒŒç©ïŒã䜿çšããããšããå§ãããŸãã ããã¯Windows / * nixéã§ã¯ç§»æ€ã§ããŸãããã以äžã§èª¬æããåé¡ã®äžéšãåé¿ã§ããŸãã
PHPã§ååž°çãªãã£ã¬ã¯ããªåé€ãå®è£
ããç°¡åãªäŸãèŠãŠã¿ãŸãããã
äžèŠãããã§ããã ããã«ãPHPã®æåãªãã¡ã€ã«ãããŒãžã£ãŒïŒeXtplorerãããã¥ã¡ã³ããžã®ã³ã¡ã³ããªã©ïŒã§ãããã©ã«ããŒã®åé€ã¯ãã®æ¹æ³ã§å®è£
ãããŸãã 次ã«ãååšããªããã¡ã€ã«ãžã®ã·ã³ããªãã¯ãªã³ã¯ãäœæãïŒln -s some_test other_testïŒãåé€ãè©Šã¿ãŸãã ãŸãã¯ããã©ã«ããŒã«èªåèªèº«ãŸãã¯FSã®ã«ãŒããžã®ã·ã³ããªãã¯ãªã³ã¯ãäœæããŸãïŒãã®ãªãã·ã§ã³ããã¹ãããªãããšããå§ãããŸãïŒ...ç¹ã«recursiveDeleteïŒïŒã®å Žåãä¿®æ£ã¯ãã¡ããç°¡åã§ããããã©ãŒãã³ã¹ã§ã
ãšã©ãŒã¯ãªãŒãã³ã°
ã¹ã¯ãªããããã¡ã€ã«ïŒããŒã¿ããŒã¹ããœã±ãããªã©ïŒã§äœããã®æäœãè¡ãå Žåãäºæããªããšã©ãŒãçºçããå Žåã«ããã°ã©ã ãæ£ããã·ã£ããããŠã³ããå¿
èŠããããŸãããã°ãžã®æžã蟌ã¿ãäžæãã¡ã€ã«ã®ã¯ãªã¢ããã¡ã€ã«ããã¯ã®åé€ãªã©ã§ãã .dã
PHP Webã¢ãŒãã§ã¯ãããã¯register_shutdown_functionïŒïŒã䜿çšããŠå®è£
ãããŸããããã¯ãã¹ã¯ãªãããèŽåœçãªãšã©ãŒã§çµäºããå Žåã§ãããªã¬ãŒãããŸãïŒãã®æ¹æ³ã¯ãã¡ãªã¿ã«ãã¡ã¢ãªäžè¶³ãšã©ãŒãå«ãã»ãšãã©ãã¹ãŠã®ãšã©ãŒããã£ããããã®ã«é©ããŠããŸãïŒã CLIã¢ãŒãã§ã¯ãããšãã°ããŠãŒã¶ãŒãã¹ã¯ãªããCtrl + Cãéä¿¡ã§ããregister_shutdown_functionïŒïŒãæ©èœããªãããããã¹ãŠãå°ãè€éã«ãªããŸãã
ãããã説æã¯ç°¡åã§ããPHPã¯ããã©ã«ãã§UNIXã·ã°ãã«ããŸã£ããåŠçããªããããã·ã°ãã«ãåä¿¡ãããšããã«ã¹ã¯ãªãããçµäºããŸãã ããã¯ã<ïŒPhpã®åŸã«ãã¡ã€ã«ã®å
é ã«declareïŒticks = 1ïŒãè¿œå ããé¢å¿ã®ããã·ã°ãã«ã®ãã³ãã©ãŒãç»é²ããããšã§ä¿®æ£ã§ããŸãïŒè©³çŽ°ã¯
ãã¡ã ïŒã
pcntl_signal(SIGINT, function() { exit(1); });
ä¿¡å·åŠçã®æ©èœã¯ããã¹ãŠã®äººã§åãã§ããå¿
èŠã¯ãããŸããã ã·ã°ãã«ãã³ãã©ãŒå
ã§exitïŒïŒãåŒã³åºãããšã¯ã§ããŸãã-ã·ã°ãã«ãåŠçãããåŸãã¹ã¯ãªããã¯å®è¡ãç¶ããŸãã
è€æ°ã®ããã»ã¹ã§ããŒã¿ããŒã¹ãæäœããïŒforkïŒïŒã®åŸïŒ
æšå¥šäºé
ã¯éåžžã«ç°¡åã§ããforkïŒïŒãå®è¡ããåã«ããŒã¿ããŒã¹ãžã®ãã¹ãŠã®æ¥ç¶ãéããå¿
èŠããããŸãïŒçæ³çã«ã¯ãfopenïŒïŒã§éããŠãããã¡ã€ã«ãååšããªãã¯ãã§ãïŒã ãããã®å Žåã«forkïŒïŒãå®è¡ãããšãéåžžã«å¥åŠãªçµæãçããå¯èœæ§ããããããŒã¿ããŒã¹ã«æ¥ç¶ããå Žåããã©ãŒã¯ãããããã»ã¹ã®ããããã®å®äºåŸã«æ¥ç¶ãéããã ãã§ãã åãSQLiteããã¥ã¢ã«ã§ã¯ãforkïŒïŒã®åã«éããããªãœãŒã¹ã¯ããã®ããã«ãã«ãã¹ã¬ããã¢ã¯ã»ã¹ããµããŒãããŠããªããããforkïŒïŒããã»ã¹ã§äœ¿çšã§ããªãããšãæ瀺ããŠããŸãã ãããã«ããŠããPHPã®pcntl_forkïŒïŒã¯forkïŒïŒãäœæãããšã©ãŒããã°ã«èšé²ããã ããªã®ã§ãCãšåæ§ã«æ
éã«åŠçããå¿
èŠããããŸãã
è€éãªã¬ã³ããªã³ã°ã«ncursesã䜿çšãã
ncursesã©ã€ãã©ãªã¯ã端æ«å
ã®ã«ãŒãœã«ã®äœçœ®ãå¶åŸ¡ããããã®escã·ãŒã±ã³ã¹ãå¿é
ããå¿
èŠããªããããšãã°è²ã䜿çšããããã°ã©ã ãã·ã¹ãã ãšç«¯æ«éã§ç§»æ€å¯èœã§ããããã«ç¹å¥ã«äœæãããŸããã äžæ¹ãã«ã©ãŒåºåãªã©ã®åçŽãªãã®ã§ãã£ãŠããSTDOUTã¯åžžã«ã«ã©ãŒããµããŒããããšã¯éããªãããšã«çæããå¿
èŠããããŸãã ã¿ãŒããã«ãã«ã©ãŒããµããŒãããŠãããã©ãããncursesãªãã§èª¿ã¹ã-STDOUTã¿ãŒããã«ãïŒposix_isattyïŒ1ïŒïŒã§ãããã©ããã確èªãã1ã€ã®ããªããã£ãã§ãããä¿¡é Œã§ããªãæ¹æ³ãç¥ã£ãŠããŸãã
ç»é¢ã«è¡šç€ºãããæ°
ã»ãšãã©ã®æšæºããã°ã©ã ã¯ã-vã¹ã€ããïŒåé·ããããã¹ãïŒãæå®ããŠç¹ã«èŠæ±ãããªãéããç»é¢ã«ã»ãšãã©äœã衚瀺ããŸããã å®éãçç±ããªãç»é¢ãè©°ãŸãããªãã§ãã ããã ãã©ã³ã¹ãèŠã€ããã®ã¯é£ããå ŽåããããŸãããããã€ãã®ç°¡åãªæšå¥šäºé
ããããŸãã
- æäœã«æéãããããªãå ŽåïŒ10ç§æªæºïŒãäœãå°å·ããªãã§ãã ããã
- èªæã§ã¯ãªãããšïŒããšãã°ãsudoã䜿çšããŠäžæçãªããã€ã¹ãããŠã³ãããïŒãå®è¡ããŠããå Žåã¯ãéã«ããšã©ãŒãçºçããå Žåã®å¯ŸåŠæ¹æ³ããŠãŒã¶ãŒã«ç¥ãããããã«ããã®ããšããŠãŒã¶ãŒã«éç¥ããŸãã
- æäœãé·ãããã®é²è¡ç¶æ³ã衚瀺ã§ããå Žåã¯ããã®é²è¡ç¶æ³ã衚瀺ããããšããå§ãããŸãïŒãã®ãããäžèšã®cSystemé¢æ°ã圹ç«ã¡ãŸãïŒã
- ããã°ã©ã ããã£ã«ã¿ãŒãšããŠæ©èœããå ŽåïŒããšãã°ãcatãgrepãgzip ...ïŒãããŒã¿ã®ã¿ãSTDOUTã«ããããšã©ãŒãå
¥åã®ããã³ãããªã©ãSTDERRã«ç§»åããŠããã§ãŒã³å
ã®æ¬¡ã®ããã°ã©ã ãåä¿¡ããªãããã«ããŸããäžèŠãªãŽãã
é²è¡ç¶æ³ã衚瀺ããã«ã¯ãgitãšåãããã«ããŸãããã¹ãŠã®ç«¯æ«ã®å¹
ãå°ãªããšã80æåã§ãããšããä»®å®ã䜿çšããåºå®å¹
ã®è¡ãå°å·ããŸãã ãã£ãªããžãªã¿ãŒã³æåïŒ\ rïŒãã«ãŒãœã«ãè¡ã®å
é ã«æ»ãïŒãããŠæ¬¡ã®åºåãåã®è¡ã«ãã£ããã®ãäžæžãããïŒããšãèãããšãããšãã°ã0ãã100ãŸã§ã®æäœã®å²åã衚瀺ããã³ãŒããæžãã®ã¯éåžžã«ç°¡åã§ããåæã«ããŠãŒã¶ãŒã®ç»é¢ã§1è¡ã®ã¿ãååŸããŸãã
for($i = 0; $i <= 100; $i++) { printf("\r%3d%%", $i); sleep(1); } echo "\n";
ã¹ã¯ãªãããåŒã³åºãããŠãŒã¶ãŒã®ååãå®çŸ©ãã
ãŠãŒã¶ãŒåã¯USERç°å¢å€æ°ïŒ$ _ENV ['USER']ïŒã«å«ãŸããŠããŸããããã£ããã1ã€ãããŸã-ãã®ã¡ãœããã¯ã誀ã£ãããŒã¿ãå ±åã§ããç°å¢å€æ°ã䜿çšããŸãïŒãŠãŒã¶ãŒã¯ãUSER = root myscriptãªã©ã®ã¹ã¯ãªãããå®è¡ã§ããã¹ã¯ãªããã¯ãŠãŒã¶ãŒåãã«ãŒãã§ãããšä»®å®ããŸãïŒã
ãããã£ãŠãposixé¢æ°ã䜿çšããå¿
èŠããããŸãã
ãããã«
ãã®èšäºã§ã¯ãäžè¬çãªã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ãäœæãããã¹ãŠã®ããã°ã©ãããããPHPéçºè
ã«çŽæ¥æããã§ã¯ãªãæšå¥šäºé
ãæäŸããããšããŸããã äžèšã®å€ãã¯ä»ã®ããã°ã©ãã³ã°èšèªã«ãé©çšã§ããŸãããããããPHPã§æžããªã人ã«ãšã£ãŠã¯ããã€ãã®ç¹ã圹ç«ã€ã§ãããã
Yuri youROCK NasretdinovãBadooéçºè