목차
?
CLI PHP 的优点
安装
PHP 调试
使用 CLI 定位并修正错误
清单 1. 再次运行结果
PHP I/O 通道
STDOUT:echo、print、STDOUT 和 php://stdout
STDERR:STDERR 和 php://stderr
STDIN:STDIN 和 php://stdin
第一个 PHP shell 脚本
清单 2. randomize-lines
命令行参数
清单 3. randomize-lines-w-args
结束语
参考资料
学习
获得产品和技术
讨论
백엔드 개발 PHP 튜토리얼 PHP 命令行?是的,您可以

PHP 命令行?是的,您可以

Jun 13, 2016 am 11:38 AM
cli output php

PHP 命令行?是的,您可以!

将 PHP 用于一般目的的脚本并将命令行接口用于 PHP 调试

了解如何通过命令行调试 PHP 代码,以及体验 PHP 本身作为 shell 脚本语言的强大之处。

?

CLI PHP 的优点

多年以来,我一直都在应用不确定的工程师职责定义。我个人认为,工程师就是使用工具来实现与该工具最初开发目的无关的功能。虽然这种想法并不总是正确,但当您认真考虑它时,将发现大多数创新和发明确实来自于通过以前从未考虑过的方法使用工具。

?

想象一下我是多么惊讶,然后,我忽然想到一个主意:使用我的老朋友 PHP,作为命令行工具,它对于 Web 页面来说一直都非常可靠。我绝对不是这样做的第一人,但是这对我来说的确是全新的想法。

?

当然,只是可以 在命令行中使用 PHP 当然不是这样做的最佳理由。但是,您在第一次开始以这种方式用 PHP 进行试验时可能很快就会发现几个令人兴奋的惊喜。首先,调试现有脚本将变得前所未有地简单。由主要输出和极少逻辑组成的 PHP 程序都将变得令人难以置信地简单。除此之外,您还可以使用所有 PHP 知识来完成以前从未想过使用 PHP 完成的任务。事实上,确实没有任何事能阻止您使用 PHP 作为几乎所有给定编程项目的全能王。

?

产生兴趣了?很好,让我们开始着手并看看您可以在命令行中使用 PHP 来完成哪些任务。

?

安装

安装十分简单扼要,它甚至可能都不需要特别安装任何内容。开始时先在命令行中尝试一个简单的 PHP 脚本。您可以使用现有 PHP 脚本,也可以尝试使用以下代码。本例是基于 Linux? 的,但是类似的原理也适用于其他系统。

?

首先,确认 PHP 可执行文件的位置 —— 对于大多数 Linux 系统,几乎肯定是 /usr/bin/php。如果不确定其位置,请在命令行中键入 which php 并查看响应内容。

?

其次,键入以下代码,确保将 /usr/bin/php 替换为 PHP 可执行文件的实际路径。

#!/usr/bin/php -qHello world
로그인 후 복사

?

保存文件并确保用可执行权限做了标记。在大多数系统中,您都可以用 chmod +x hello-world 或类似代码完成此操作。然后,执行 PHP 文件(通过运行 ./hello-world 或者,如果有必要,运行 php hello-world),并查看它是否运行。如果它运行,则安装的 PHP 在默认情况下会包括命令行功能。

如 果代码未能正确运行,事情可能会变得有点儿麻烦。关于原因有很多种不同的可能性。如果您得到一个与 PHP 相关的错误(除了 “未找到程序” 之类的结果),则问题是代码中的输入错误。如果未找到 PHP 可执行文件,请确保您使用了正确的路径。如果没有名为 PHP 的可执行文件,则必须获得一个。

?

获得 PHP 可执行文件可能根据所在系统的不同采取不同的步骤,但是获得所需支持不应当太难。您可以从查阅针对特定操作系统或发行版的文档开始。

?

很明显,如果这时系统中未安装 PHP,则先安装 PHP,然后再次尝试执行以上代码。对于许多系统,安装 PHP 是您需要做的全部操作。如果需要执行更多操作,有时只需使用您最喜欢的包管理工具(例如 apt-getyum)获得 PHP CLI 包(名称可能略有不同)就可以解决此问题。

?

如果在 PHP 包管理工具中未能找到命令行,最糟糕的情况是您可以用 --enable-cli 标记重新编译 PHP。事实上,这样做的优点是提供了稍微优化了的系统并且不管怎么说都不是个坏主意。无论采用哪种方式,开始使用它都不应当太难。

?

到 现在,您应当已经运行了 HelloWorld 脚本,并且输出就是可能已经猜测到的结果。我不会详细说明该脚本的工作原理,但是使用过 shell 脚本和 PHP 的人应当十分熟悉脚本的大部分内容。由于这第一个脚本现在的运行没有出现任何问题(我们希望如此!),因此我们将略微偏离真正的命令行接口 (CLI) 应用程序,看一看为什么在命令行中使用 PHP 对于所有 PHP 程序员来说都是最佳选择的好理由:调试。

?

PHP 调试

可能只有我有这种体验,但是我经常发现调试 CLI 程序会演变成一场噩梦,尤其是处理嵌入了 HTML 的脚本,例如 Microsoft? Active Server Pages (ASP) 或 PHP。通常很难判断特定错误消息所表达的精确含义,用户输入可能很难再次生成,并且整件事通常会使您头痛的希望拔光头发。

?

不幸的是,虽然 足够聪明的程序员可以找到 CLI 能够有所帮助的方法(例如,通过从文件读取输入或通过一个通道的另一个程序),但是大部分问题都不会由于使用命令行而显著减弱。不过,CLI 确实使一件事变得更加简单:找到错误消息,以便可以在第一位置读取这些错误消息。

?

为了查看使用命令行调试的值,让我们从下面所示的非常非常糟糕的 PHP 文件开始。

#!/usr/bin/php -qDon<'t>code<?php while drunk(); ?<
로그인 후 복사

?

虽然第一眼看到代码时,就发现这个脚本中的一些错误十分明显,但是代码在 Web 浏览器中提供了无用调试信息的极好示例。尤其是,不会发生这种情况:在 Apache 中运行此页面只是得到了根本没有输出的结果。如果错误不明显,那么您怎样找到错误原因?

?

解决这个问题的传统方法是查看错误日志。例如,您可能先运行:

tail -f /var/log/httpd/error_log
로그인 후 복사

?

然后再将页面装入运行 Apache 2 的 Linux 系统,这将得到诸如下面的输出:

[client 127.0.0.1] PHP Parse error:  parse error, unexpected T_STRING, expecting     '(' in /var/www/html/dont-code-drunk.php on line 2
로그인 후 복사

?

不幸的是,您可能同意我的观点,考虑这种不太理想的解决方案。一方面,文件日志位置可能因系统的不同而有所不同。另一方面,您必须浏览不相关事件的日志以查找所需内容,这对于活动的服务器来说很可能是一场噩梦。

?

此时,您可能和我曾经想的一样:一定会有更好的方法。

?

使用 CLI 定位并修正错误

通过直接在 CLI 上运行脚本,可以轻松地分离出代码中存在的问题。运行:

php dont-code-drunk.php
로그인 후 복사

?

结果,可能会得到以下输出:

PHP Parse error:  parse error, unexpected T_STRING, expecting     '(' in /var/www/html/dont-code-drunk.php on line 2Content-type: text/htmlX-Powered-By: PHP/4.3.11
로그인 후 복사

?

更棒了!错误消息已与其他数据分离,并且在做出更改后可以轻松地重新查看页面。在这种情况下,很清楚它在行中某个位置需要 '('while 语句看似适合用在这里,因此添加一组新括号,得到以下源代码。

#!/usr/bin/php -qDon<'t>code<?php while (drunk()); ?<
로그인 후 복사

?

现在,再次运行代码将得到以下输出:

?
清单 1. 再次运行结果
Content-type: text/htmlX-Powered-By: PHP/4.3.11<'t>codePHP Fatal error:  Call to undefined function:    drunk() in /var/www/html/dont-code-drunk.php on line 2
로그인 후 복사

?

脚本仍有很多问题,但是您已经取得了一些进展。您已经相对轻松地提取到了所需的错误消息,使您可以快速修正程序中的问题并继续处理下一个问题。

?

全然使用 PHP 的任何人都可以以这种方式充分利用 CLI PHP 进行调试。但是为什么不进一步伸展您自己并开始用 PHP 真正实现 shell 脚本?向前迈进,并且您将会看到将 PHP 用于简单或者不那么简单的 shell 脚本的一些可能性。

?

PHP I/O 通道

为第一个 PHP 脚本制定一个简单的初始目标:创建一个能读入文件并打乱该文件中各行的脚本。如果要打乱 m3u 文件或类似内容,则使用此功能可能很便利。这样做意味着您必须能够从文件或标准输入读取数据并将数据写回终端。

?

这将出现 PHP 中的第一大挑战。PHP 最初不是设计用于与用户直接的键盘输入或文本输出结合使用。了解这一设计是至关重要的,因为如果需要在命令行中执行任何操作,都必须能够与用户来回通信。在诸如 C 之类的传统编程语言中,您将使用 STDINSTDOUTSTDERR 完成此操作。您可以将 PHP 中的相同通道分别用于输入、标准输出和输出到错误通道。

?

STDOUT:echo、print、STDOUT 和 php://stdout

即 使 PHP 设计用于输出到浏览器而不是输出到 CLI,从 PHP 创建输出也是非常简单的,它几乎不需要花太多时间思考。记住,PHP 标记外的任何内容都将被直接输出到 CLI,这就是上面的 HelloWorld 程序如此简单的原因。这也是为什么先输出上面的 Don<'t>code 后再输出错误消息的原因。您是否用 HTML 标记圈起文字都没有关系;因为不管怎样都会显示这些文字。事实上,您通常需要避免使用 HTML 标记,因为它们都将直接打印给用户。

?

您还可以使用基本函数进行输出。例如,echoprint 命令打印到标准输出。

#!/usr/bin/php -qOutput #1.<?php echo "Output #2.";print "Output #3."?>
로그인 후 복사

?

这将得到:

Output #1.Output #2.Output #3.
로그인 후 복사

?

注:PHP 标记外的新行已被输出,但是 echo 命令或 print 命令中没有暗含的新行。事实上,命令提示符重新出现在 Output #2.Output #3. 所在的行中。PHP 拥有的任何其他打印函数将会像此函数一样运行正常,任何写回文件的函数也是一样的。

#!/usr/bin/php -q<?php        $STDOUT = fopen("php://stdout", "w");        fwrite($STDOUT, "Output #1.");        fclose($STDOUT);?>
로그인 후 복사

?

以上代码将把 php://stdout 作为输出通道显式打开,并且 php://output 通常以与 php://stdout 相同的方法运行。最新版本的 PHP 可以使用 STDOUT 作为常量而不是定义上面使用的变量 $STDOUT

?

STDERR:STDERR 和 php://stderr

STDERRSTDOUT 十分接近。用于写入此通道的所有技术将镜像 STDOUT 的那些技术,惟一的差别是您将打开 php://stderr 而不是 php://stdoutphp://error

?

STDIN:STDIN 和 php://stdin

STDIN 是从 Web 编程而来的最有趣更改,因为它向您展示了真正的用户输入而不是使用表单或其他基于浏览器的方法。尝试以下命令:

#!/usr/bin/php -q<?php        $file = file_get_contents("php://stdin", "r");        echo $file;?>
로그인 후 복사

?

这段代码的工作原理应当很像 cat,回转提供给它的所有输入。但是,这时它还不能接受参数。

?

第一个 PHP shell 脚本

很好 —— 从这里开始事情会变得非常有趣。运用到目前为止学到的简单知识,您可以创建简单而有用的 shell 脚本。在文本编辑器中键入以下代码。

?
清单 2. randomize-lines
#!/usr/bin/php -q<?php        $lines = split("\n", file_get_contents("php://stdin", "r"));        shuffle($lines);        foreach ($lines as $line) {                if ($line !== "") {                        echo "$line\n";                }        }?>
로그인 후 복사

?

现在,只需一些快速检查即可运行这个脚本:

  1. 确保 hashbang(第一行,以 #! 开头)被设为先前描述的 PHP 可执行文件的位置
  2. 保存文件
  3. 使用 chmod 添加可执行权限
  4. 运行程序

注:randomize-lines 将完全执行所期望的操作:它打乱键入的输入内容行并将它们以不同的顺序返回回来。这项功能可以颇具价值地填补 shell 脚本库中的空白。

?

作为此脚本的应用程序示例,您可以使用它为音乐或视频播放器动态生成随机播放列表。例如,要打乱 XMMS 播放列表,请尝试:

./randomize-lines < .xmms/xmms.m3u > tempmv temp .xmms/xmms.m3u
로그인 후 복사

?

现在,再升一级。

?

命令行参数

实际命令行程序使用参数。同样,就像 C 语言和其他类似语言一样,您可以为此目的而使用 argvargc。特别是,argv 是程序的参数数组,第一个参数是程序本身。使用这个函数,构建根据给定参数从文件或用户输入读取数据的程序就不难了。例如,请查看以下代码。

?
清单 3. randomize-lines-w-args
#!/usr/bin/php -q<?php        array_shift($argv);        if (count($argv) == 0) {                $argv[0] = "php://stdin";        }        foreach ($argv as $file) {                $lines = split("\n", file_get_contents($file, "r"));                shuffle($lines);                foreach ($lines as $line) {                        if ($line !== "") {                                echo "$line\n";                        }                }        }?>
로그인 후 복사

?

现在您拥有这样一个程序:完全运行的 CLI PHP 程序,它可以接受用户输入,也可以接受文件列表并随机排列每个文件的相关内容。

?

结束语

工欲善其事,必先利其器;但是记住:最佳工具通常都不是您期望使用的那一个工具。请给 PHP 一个机会,在命令行接口中使用它,您就会发现它已经成为您的 shell 脚本工具新宠。最糟糕的情况是:它可以省去一些 Web 服务器麻烦。

?

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
  • 阅读 “PHP by example” 发现 PHP 用于构建复杂且功能强大的 Web 相关程序的简单方法。
  • PHP Freaks 讨论了如何在 CLI 上使用 PHP。
  • PHP CLI 拥有它自己的 Web 站点。谁知道?
  • PHP.net 是 PHP 开发人员的资源。
  • 查阅 “PHP 推荐读物列表”。
  • 浏览 developerWorks 上所有的 PHP 文章 和 PHP 教程。
  • 查阅 IBM developerWorks 的 PHP 项目资源中心 扩展 PHP 技巧。
  • 要收听针对软件开发人员的有趣访谈和讨论,一定要访问 developerWorks podcast。
  • 随时关注 developerWorks 的 技术事件和网络广播。
  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动。
  • 访问 developerWorks 开源软件技术专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
  • 访问 Safari 在线书店 浏览开放源码技术的各种参考资料。

获得产品和技术

  • 使用 IBM 试用软件 构建您的下一个开发项目,这些软件可以通过下载或从 DVD 中获得。

讨论

  • 参与 developerWorks blog,加入 developerWorks 社区。
  • 参与 developerWorks PHP 开发者论坛。

来源:http://www.ibm.com/developerworks/cn/opensource/os-php-command/

?

?

?

?

?

?

?

?

?

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

이전에 몰랐던 후회되는 PHP 함수 7가지 이전에 몰랐던 후회되는 PHP 함수 7가지 Nov 13, 2024 am 09:42 AM

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). Apr 03, 2025 am 12:04 AM

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? Apr 03, 2025 am 12:03 AM

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

See all articles