2012-04-22 35 views

Trả lời

10

Lưu ý rằng việc chạy PHP từ trình bao hoàn toàn khác với việc chạy PHP trong môi trường máy chủ web. Nếu bạn chưa thực hiện lập trình dòng lệnh trước đây, bạn có thể gặp phải một số điều bất ngờ.

Điều đó nói rằng, cách thông thường để truyền thông tin vào một lệnh là bằng cách đặt nó trên dòng lệnh. Nếu bạn làm điều này:

php /my/directory/file.php "some value" "some other value" 

Sau đó bên trong kịch bản của bạn, $argv[1] sẽ được thiết lập để "some value"$argv[2] sẽ được thiết lập để "some other value". ($argv[0] sẽ được đặt thành "/my/directory/file.php").

+0

Tôi đã thử điều đó, nó không hoạt động. tôi có phải đặt đối số thứ hai giữa các trích dẫn để tôi có thể đọc nó ở đó không? bởi vì tôi không sử dụng trích dẫn trong lệnh. –

+0

PHP của bạn có được xây dựng cho dòng lệnh không? Đó là một SAPI khác, và yêu cầu một nhị phân PHP khác với mã nhị phân mà bạn sử dụng cho các CGI. –

+0

Tôi sử dụng lệnh shell_exec ("lệnh"); để tạo ra crontabs –

6

Khi bạn thực thi tập lệnh PHP từ dòng lệnh, bạn có thể truy cập số biến từ $argc và các giá trị thực tế trong mảng . Một ví dụ đơn giản.

Cân nhắc test.php

<?php 
printf("%d arguments given:\n", $argc); 
print_r($argv); 

Thi công này sử dụng php test.php a b c:

4 arguments given: 
Array 
(
    [0] => test.php 
    [1] => a 
    [2] => b 
    [3] => c 
) 
+0

+1 để được giải thích. –

0

N một trong những phương pháp trên làm việc cho tôi. Tôi chạy cron trên máy chủ chia sẻ của hoster của tôi. Tác vụ cron được tạo ra với giao diện giống như cPanel. Dòng lệnh gọi PHP truyền tên kịch bản và một vài đối số.

Đó là cách dòng lệnh cho cron trông:

php7.2 /server/path/to/my/script/my-script.php "test.tst" "folder=0"

Cả các câu trả lời trên với làm việc cho trường hợp của tôi.

Vấn đề không được bảo là bạn phải khai báo là toàn cầu trước khi bạn có quyền truy cập vào đối số CLI. Điều này không được đề cập trong sách hướng dẫn PHP chính thức.

Vâng, có lẽ một người phải khai báo toàn cầu cho các tập lệnh chạy với máy chủ. Có thể trong một môi trường cục bộ chạy script trong CLI không yêu cầu được khai báo toàn cục. Khi tôi kiểm tra nó tôi đăng ở đây.

Nhưng nevertherless cho trường hợp của tôi cấu hình làm việc là:

global $argv; 
echo "argv0: $argv[0]\n\r"; // echoes: argv0: /server/path/to/my/script/my-script.php 
echo "argv1: $argv[1]\n\r"; // echoes: argv1: test.tst 
echo "argv2: $argv[2]\n\r"; // echoes: argv2: folder=0 

tôi có kết quả tương tự với $_SERVER['argv'] mảng superglobal. Người ta có thể sử dụng nó như sau:

$myargv = $_SERVER['argv']; 
echo $myargv[1]; // echoes: test.tst 

Hy vọng rằng sẽ giúp ai đó.

Các vấn đề liên quan