2012-03-08 39 views
127

Tôi đang gọi một tập lệnh PHP bất cứ khi nào trang web tải. Tuy nhiên, có một tham số mà kịch bản PHP cần phải chạy (mà tôi thường đi qua dòng lệnh khi tôi đang thử nghiệm kịch bản lệnh).Làm cách nào để chuyển các tham số vào tập lệnh PHP thông qua trang web?

Làm cách nào để chuyển đối số này mỗi khi tập lệnh được chạy khi tải trang?

+0

Làm thế nào để bạn chạy? – zerkms

+1

Bạn có thể đăng mã của mình không? – SenorAmor

+1

để bạn muốn chạy một dòng lệnh? hoặc một tập lệnh php? –

Trả lời

217

Có lẽ bạn đang đi qua các đối số ở trên dòng lệnh như sau:

php /path/to/wwwpublic/path/to/script.php arg1 arg2 

... và sau đó truy cập vào chúng trong kịch bản thusly:

<?php 
// $argv[0] is '/path/to/wwwpublic/path/to/script.php' 
$argument1 = $argv[1]; 
$argument2 = $argv[2]; 
?> 

Những gì bạn cần phải khi thực hiện các đối số thông qua HTTP (truy cập tập lệnh qua web) đang sử dụng chuỗi truy vấn và truy cập chúng thông qua $ _GET superglobal:

Đi tới http://yourdomain.com/path/to/script.php?argument1=arg1&argument2=arg2

... và truy cập:

<?php 
$argument1 = $_GET['argument1']; 
$argument2 = $_GET['argument2']; 
?> 

Nếu bạn muốn kịch bản để chạy bất kể nơi bạn gọi nó là từ (dòng lệnh hoặc từ trình duyệt), bạn sẽ muốn một cái gì đó như sau:

EDIT: như được chỉ ra bởi Cthulhu trong các nhận xét, cách trực tiếp nhất để kiểm tra môi trường bạn đang thực hiện là sử dụng hằng số PHP_SAPI. Tôi đã cập nhật mã cho phù hợp:

<?php 
if (PHP_SAPI === 'cli') { 
    $argument1 = $argv[1]; 
    $argument2 = $argv[2]; 
} 
else { 
    $argument1 = $_GET['argument1']; 
    $argument2 = $_GET['argument2']; 
} 
?> 
+2

Mẫu mã cuối cùng của bạn sẽ ném thông báo – zerkms

+1

có lẽ "if (isset ($ _ GET))" – Jason

+0

Tôi sẽ sử dụng 'empty ($ _ GET)'. '$ _GET' là một giá trị được xác định trước, vì vậy tôi khá chắc chắn nó luôn được thiết lập, nhưng trống nếu không có tham số GET nào được đặt. 'empty()' trả về 'false' cho các chuỗi và mảng rỗng. –

15
$argv[0]; // the script name 
$argv[1]; // the first parameter 
$argv[2]; // the second parameter 

Nếu bạn muốn tất cả các kịch bản để chạy bất kể nơi bạn gọi nó là từ (dòng lệnh hoặc từ trình duyệt), bạn sẽ muốn một cái gì đó như sau :

<?php 
if ($_GET) { 
    $argument1 = $_GET['argument1']; 
    $argument2 = $_GET['argument2']; 
} else { 
    $argument1 = $argv[1]; 
    $argument2 = $argv[2]; 
} 
?> 

Để gọi từ dòng lệnh chmod 755 /var/www/webroot/index.php và sử dụng

/usr/bin/php /var/www/webroot/index.php arg1 arg2 

Để gọi từ trình duyệt, sử dụng

http://www.mydomain.com/index.php?argument1=arg1&argument2=arg2 
Các vấn đề liên quan