찾다
백엔드 개발PHP 튜토리얼 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 -q
Hello 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 -q
Don<'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 2
Content-type: text/html
X-Powered-By: PHP/4.3.11

?

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

#!/usr/bin/php -q
Don<'t>code<?php while (drunk()); ?<

?

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

?
清单 1. 再次运行结果
Content-type: text/html
X-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 程序如此简单的原因。这也是为什么先输出上面的 Doncode 后再输出错误消息的原因。您是否用 HTML 标记圈起文字都没有关系;因为不管怎样都会显示这些文字。事实上,您通常需要避免使用 HTML 标记,因为它们都将直接打印给用户。

?

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

#!/usr/bin/php -q
Output #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 > temp
mv 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으로 문의하세요.
세션 고정 공격을 어떻게 방지 할 수 있습니까?세션 고정 공격을 어떻게 방지 할 수 있습니까?Apr 28, 2025 am 12:25 AM

세션 고정 공격을 방지하는 효과적인 방법은 다음과 같습니다. 1. 사용자 로그인 한 후 세션 ID 재생; 2. 보안 세션 ID 생성 알고리즘을 사용하십시오. 3. 세션 시간 초과 메커니즘을 구현하십시오. 4. HTTPS를 사용한 세션 데이터를 암호화합니다. 이러한 조치는 세션 고정 공격에 직면 할 때 응용 프로그램이 파괴 할 수 없도록 할 수 있습니다.

세션리스 인증을 어떻게 구현합니까?세션리스 인증을 어떻게 구현합니까?Apr 28, 2025 am 12:24 AM

서버 측 세션 스토리지가없는 토큰에 저장되는 토큰 기반 인증 시스템 인 JSONWEBTOKENS (JWT)를 사용하여 세션없는 인증 구현을 수행 할 수 있습니다. 1) JWT를 사용하여 토큰을 생성하고 검증하십시오. 2) HTTPS가 토큰이 가로 채지 못하도록하는 데 사용되도록, 3) 클라이언트 측의 토큰을 안전하게 저장, 4) 변조 방지를 방지하기 위해 서버 측의 토큰을 확인하기 위해 단기 접근 메커니즘 및 장기 상쾌한 토큰을 구현하십시오.

PHP 세션과 관련된 일반적인 보안 위험은 무엇입니까?PHP 세션과 관련된 일반적인 보안 위험은 무엇입니까?Apr 28, 2025 am 12:24 AM

PHP 세션의 보안 위험에는 주로 세션 납치, 세션 고정, 세션 예측 및 세션 중독이 포함됩니다. 1. HTTPS를 사용하고 쿠키를 보호하여 세션 납치를 방지 할 수 있습니다. 2. 사용자가 로그인하기 전에 세션 ID를 재생하여 세션 고정을 피할 수 있습니다. 3. 세션 예측은 세션 ID의 무작위성과 예측 불가능 성을 보장해야합니다. 4. 세션 중독 데이터를 확인하고 필터링하여 세션 중독을 방지 할 수 있습니다.

PHP 세션을 어떻게 파괴합니까?PHP 세션을 어떻게 파괴합니까?Apr 28, 2025 am 12:16 AM

PHP 세션을 파괴하려면 먼저 세션을 시작한 다음 데이터를 지우고 세션 파일을 파괴해야합니다. 1. 세션을 시작하려면 세션 _start ()를 사용하십시오. 2. Session_Unset ()을 사용하여 세션 데이터를 지우십시오. 3. 마지막으로 Session_Destroy ()를 사용하여 세션 파일을 파괴하여 데이터 보안 및 리소스 릴리스를 보장하십시오.

PHP의 기본 세션 저장 경로를 어떻게 변경할 수 있습니까?PHP의 기본 세션 저장 경로를 어떻게 변경할 수 있습니까?Apr 28, 2025 am 12:12 AM

PHP의 기본 세션 저장 경로를 변경하는 방법은 무엇입니까? 다음 단계를 통해 달성 할 수 있습니다. session_save_path를 사용하십시오 ( '/var/www/sessions'); session_start (); PHP 스크립트에서 세션 저장 경로를 설정합니다. php.ini 파일에서 세션을 설정하여 세션 저장 경로를 전 세계적으로 변경하려면 세션을 설정하십시오. memcached 또는 redis를 사용하여 ini_set ( 'session.save_handler', 'memcached')과 같은 세션 데이터를 저장합니다. ini_set (

PHP 세션에 저장된 데이터를 어떻게 수정합니까?PHP 세션에 저장된 데이터를 어떻게 수정합니까?Apr 27, 2025 am 12:23 AM

tomodifyDatainAphPessess, startSessionstession_start (), 그런 다음 $ _sessionToset, modify, orremovevariables.

PHP 세션에 배열을 저장하는 예를 제시하십시오.PHP 세션에 배열을 저장하는 예를 제시하십시오.Apr 27, 2025 am 12:20 AM

배열은 PHP 세션에 저장할 수 있습니다. 1. 세션을 시작하고 session_start ()를 사용하십시오. 2. 배열을 만들고 $ _session에 저장하십시오. 3. $ _session을 통해 배열을 검색하십시오. 4. 세션 데이터를 최적화하여 성능을 향상시킵니다.

Garbage Collection은 PHP 세션에 어떻게 효과가 있습니까?Garbage Collection은 PHP 세션에 어떻게 효과가 있습니까?Apr 27, 2025 am 12:19 AM

PHP 세션 쓰레기 수집은 만료 된 세션 데이터를 정리하기위한 확률 메커니즘을 통해 트리거됩니다. 1) 구성 파일에서 트리거 확률 및 세션 수명주기를 설정합니다. 2) CRON 작업을 사용하여 고재 응용 프로그램을 최적화 할 수 있습니다. 3) 데이터 손실을 피하기 위해 쓰레기 수집 빈도 및 성능의 균형을 맞춰야합니다.

See all articles

핫 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

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

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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