Tôi đã cố gắng tạo ra một crontab,vượt qua crontab một biến và đọc nó từ PHP?
ví dụ, * * * * * php /my/directory/file.php
Tôi muốn vượt qua một biến từ crontab này để đọc nó bên file.php
làm thế nào tôi có thể làm điều đó?
Cảm ơn.
Tôi đã cố gắng tạo ra một crontab,vượt qua crontab một biến và đọc nó từ PHP?
ví dụ, * * * * * php /my/directory/file.php
Tôi muốn vượt qua một biến từ crontab này để đọc nó bên file.php
làm thế nào tôi có thể làm điều đó?
Cảm ơn.
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"
và $argv[2]
sẽ được thiết lập để "some other value"
. ($argv[0]
sẽ được đặt thành "/my/directory/file.php"
).
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
)
+1 để được giải thích. –
Tôi có thể thêm vào câu trả lời cho các thông số dòng lệnh phức tạp hơn xử lý bạn có thể muốn sử dụng getopt()
: http://www.php.net/manual/en/function.getopt.php
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 đó.
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. –
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. –
Tôi sử dụng lệnh shell_exec ("lệnh"); để tạo ra crontabs –