PHP 在浏览器之外:如何编写跨平台 CLI 应用程序

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP 不仅仅是用于 Web

\n\n

当人们提到“PHP”时,大多数人会立刻想到 VKontakte 的新闻 feed、在线商店的购物车或 WordPress 的后端。这很合理:这门语言最初就是作为 Web 工具诞生的。但是,如果我告诉你,PHP 也能出色地完成那些通常交给 Python、Bash 或 Go 的任务呢?这里说的是PHP 跨平台开发——创建那些无需重写代码就能在 Windows、Linux 和 macOS 上运行的实用程序。

\n\n

在本文中,我们不会教你如何编写表单。我们将展示如何编写一个控制台文件管理器、一个日志解析器和一个文件夹监控系统——所有这些都使用纯 PHP,无需任何 Web 服务器。你将学习如何规避不同操作系统的陷阱,并编写在任何地方都能以相同方式运行的代码。

\n\n

准备好了吗?那么打开你的终端,准备好对老牌 PHP 的能力感到惊讶吧。

\n\n

为什么选择 PHP 用于跨平台任务?三个强有力的理由

\n\n

在深入代码之前,让我们先弄清楚为什么要在桌面和服务器实用程序中使用 PHP。Python 有 Django 和 Flask,Node.js 有 Express。为什么我们需要 PHP?

\n\n
    \n
  • 无处不在。 PHP 几乎安装在每个共享主机和全球 80% 的服务器上。如果你正在编写一个管理工具,目标机器上很可能已经安装了 PHP。无需安装额外的运行时环境。
  • \n
  • Web 开发者的低门槛。你已经熟悉了语法、字符串和数组处理函数。你不需要学习一门新语言来自动化服务器上的日常任务。
  • \n
  • 丰富的标准库。PHP 拥有处理文件、进程、网络套接字和 zip 归档所需的一切。而像 parallel 或 pthreads 这样的 PECL 扩展则增加了多线程支持。
  • \n
\n\n

当然,PHP 对于 GUI 应用程序并不理想(尽管有 PHP-GTK)。但对于控制台实用程序和守护进程来说,它是一个成熟且稳定的工具。让我们看看如何正确地编写这样的代码。

\n\n

跨平台 PHP 代码的基础

\n\n

首先需要记住的是:路径分隔符。在 Linux 上是 /,在 Windows 上是 \\。PHP 提供了常量 DIRECTORY_SEPARATOR,但更方便的是使用函数 DIRECTORY_SEPARATOR 或通用斜杠 /——从 PHP 7+ 开始,Windows 能很好地理解它。

\n\n

正确处理路径

\n\n
<?php\n// 不好——硬编码的斜杠\n$path = '/var/log/errors.log'; // 在 Windows 上会失败\n\n// 好——使用 DIRECTORY_SEPARATOR\n$path = 'var' . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . 'errors.log';\n\n// 最佳——使用 / 和 realpath()\n$path = __DIR__ . '/logs/errors.log';\necho $path; // 在两个操作系统上都能工作\n?>\n
\n\n

第二个重要点是编码。在 Windows 上,控制台默认通常使用 CP866,而 PHP 脚本使用 UTF-8。要在 Windows 上输出西里尔字母,请使用 mb_convert_encoding() 函数,或者在脚本开头通过 chcp 65001 设置编码。

\n\n

示例:跨平台读取文件

\n\n
<?php\nfunction readLogFile(string $filename): string {\n    // 检查文件是否存在\n    if (!file_exists($filename)) {\n        throw new RuntimeException("文件 $filename 未找到");\n    }\n    \n    // 读取内容\n    $content = file_get_contents($filename);\n    \n    // 检测操作系统并转换编码以进行输出\n    if (PHP_OS_FAMILY === 'Windows') {\n        $content = mb_convert_encoding($content, 'CP866', 'UTF-8');\n    }\n    \n    return $content;\n}\n\necho readLogFile('logs/app.log');\n?>\n
\n\n

创建一个真实的实用程序:监控文件夹变化

\n\n

让我们编写一个有用的东西——一个监控文件夹并输出

博客

书籍推荐