Menu

Cách chạy file PHP: dòng lệnh và máy chủ php -S

Chạy một tệp PHP từ terminal bằng php index.php, hoặc mở cả thư mục trong trình duyệt bằng máy chủ có sẵn của PHP: php -S localhost:8000. Cả hai cách đều không cần Apache hay XAMPP.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Để chạy một tệp PHP, mở terminal trong thư mục chứa nó rồi gõ php index.php. PHP chạy tệp và in kết quả ra terminal. Để xem một trang PHP trên trình duyệt, khởi động máy chủ có sẵn bằng php -S localhost:8000 rồi mở http://localhost:8000.

php index.php

Tệp index.php đầu tiên chỉ cần một dòng. Nhấn Chạy: đây chính xác là những gì php index.php in ra.

Code PHP nằm sau thẻ <?php. Mọi thứ trước thẻ đó được in ra như văn bản thường, đó là cách PHP trộn code với HTML.

Chạy tệp PHP từ dòng lệnh

PHP CLI (giao diện dòng lệnh) chạy một script một lần rồi thoát. Bạn cần cài PHP trước; nếu php -v báo lỗi, hãy xem cài đặt PHP trước.

cd ~/projects/hello
php index.php          # run the file
php -l index.php       # only check the syntax ("lint")
php index.php > out.txt   # save the output to a file

php -l rất hữu ích trước khi tải tệp lên: nó báo lỗi phân tích cú pháp kèm số dòng, hoặc in ra No syntax errors detected in index.php.

Truyền đối số qua $argv

Các từ đứng sau tên tệp được đưa vào $argv. $argv[0] luôn là tên của chính script và $argc là số lượng, tính cả tên đó. Ở đây khối code chạy không có đối số thêm, nên chỉ có tên script:

Trên máy của bạn, php index.php Ada 3 in lời chào ba lần. Các giá trị dự phòng ?? giúp script vẫn chạy khi thiếu đối số. Với tùy chọn có tên như --name=Ada, dùng getopt:

<?php
// php index.php --name=Ada --verbose
$opts = getopt('', ['name:', 'verbose']);
echo "Hello, " . ($opts['name'] ?? 'world') . "\n";
if (isset($opts['verbose'])) {
    echo "Verbose mode\n";
}

Chạy PHP trên trình duyệt với php -S

PHP có sẵn một máy chủ web dành cho phát triển. Khởi động nó trong thư mục chứa các tệp của bạn:

php -S localhost:8000
[Sat Oct  3 07:21:34 2026] PHP 8.3.19 Development Server (http://localhost:8000) started

Giờ http://localhost:8000/ chạy index.php, còn http://localhost:8000/about.php chạy about.php. Mỗi lần tải trang là tệp được chạy lại, với query string nằm trong $_GET. Khối code dưới đây hoạt động y như vậy: chạy nó, rồi nhấp vào một liên kết, script sẽ chạy lại với $_GET['page'] đã được gán.

Các tùy chọn hữu ích:

php -S localhost:8000 -t public        # serve the public/ folder as the web root
php -S 0.0.0.0:8000                    # reachable from other devices on your network
php -S localhost:8000 router.php       # send every request through router.php

Máy chủ có sẵn xử lý từng request một và chỉ dành cho phát triển. Trên môi trường production, PHP chạy sau Nginx hoặc Apache, thường thông qua PHP-FPM.

Kiểm tra script được khởi chạy thế nào

PHP_SAPI cho bạn biết "server API" nào đang chạy script: cli trong terminal, cli-server khi dùng php -S, và fpm-fcgi hoặc apache2handler khi chạy sau một máy chủ web thật. Những script chỉ nên chạy từ terminal sẽ kiểm tra nó trước tiên:

Chạy một dòng với php -r

Để thử nhanh, bạn không cần tệp. php -r chạy đoạn code bạn truyền vào, không cần thẻ <?php:

php -r 'echo date("Y-m-d"), PHP_EOL;'
php -r 'var_dump(0.1 + 0.2 == 0.3);'

Trên cmd của Windows, bọc code trong dấu nháy kép và dùng dấu nháy đơn bên trong. Với nhiều dòng, php -a mở một shell tương tác, mỗi câu lệnh chạy khi bạn nhấn Enter.

Biến script thành tệp thực thi trên macOS và Linux

Thêm một dòng shebang trước <?php và cấp quyền thực thi cho tệp. Dòng shebang không bị in ra:

#!/usr/bin/env php
<?php
echo "Backup started\n";
chmod +x backup.php
./backup.php

Đây là cách các script PHP chạy từ cron: 0 3 * * * /usr/bin/php /home/me/backup.php.

Mã thoát của script

Một script dòng lệnh báo thành công hay thất bại qua mã thoát (exit code), thứ mà shell script và cron có thể kiểm tra. exit(0) nghĩa là thành công, bất kỳ số nào khác nghĩa là thất bại:

<?php
$file = $argv[1] ?? '';
if (!is_file($file)) {
    fwrite(STDERR, "File not found: $file\n");
    exit(1);
}
echo "Processing $file\n";
exit(0);

Lỗi thường gặp: chạy nhầm tệp hoặc nhầm thư mục

Could not open input file: index.php nghĩa là PHP không tìm thấy tệp từ vị trí hiện tại của terminal. Kiểm tra thư mục hiện tại bằng pwd (hoặc cd trên Windows) rồi cd vào dự án, hoặc đưa đường dẫn đầy đủ: php ~/projects/hello/index.php. Với php -S, lỗi 404 cho một trang bạn biết chắc là có thường nghĩa là máy chủ đã được khởi động ở thư mục khác; dừng nó bằng Ctrl+C rồi khởi động lại ở đúng chỗ, hoặc chỉ định thư mục bằng -t. Khi tệp chạy nhưng chỉ in ra một trang trắng, hãy bật báo lỗi để xem chuyện gì đã xảy ra.

Câu hỏi thường gặp

Làm sao chạy một tệp PHP trên trình duyệt?

Khởi động máy chủ có sẵn trong thư mục chứa tệp bằng php -S localhost:8000, rồi mở http://localhost:8000/yourfile.php. Mở tệp trực tiếp từ ổ đĩa sẽ không được, vì không có gì chạy code PHP cả.

Làm sao truyền đối số cho một script PHP?

Viết chúng sau tên tệp: php report.php 2026 sales. Bên trong script, $argv là mảng ['report.php', '2026', 'sales'] và $argc là 3. Phần tử đầu tiên luôn là tên script.

Làm sao chạy một dòng PHP mà không cần tệp?

Dùng php -r và bỏ thẻ <?php: php -r 'echo strtoupper("hi"), PHP_EOL;'. Với nhiều dòng, php -a mở một shell tương tác.

Làm sao biết PHP đang chạy từ dòng lệnh hay từ máy chủ web?

Kiểm tra PHP_SAPI (hoặc php_sapi_name()). Giá trị là "cli" trong terminal, "cli-server" khi chạy bằng php -S, và kiểu như "fpm-fcgi" hoặc "apache2handler" khi chạy sau một máy chủ web.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu