ฉันกำลังเรียกสคริปต์ PHP ทุกครั้งที่โหลดหน้าเว็บ อย่างไรก็ตามมีพารามิเตอร์ที่สคริปต์ PHP จำเป็นต้องเรียกใช้ (ซึ่งปกติแล้วฉันจะผ่านบรรทัดคำสั่งเมื่อฉันทดสอบสคริปต์)
ฉันจะส่งผ่านข้อโต้แย้งนี้ทุกครั้งที่สคริปต์รันเมื่อโหลดหน้าเว็บได้อย่างไร
ฉันกำลังเรียกสคริปต์ PHP ทุกครั้งที่โหลดหน้าเว็บ อย่างไรก็ตามมีพารามิเตอร์ที่สคริปต์ PHP จำเป็นต้องเรียกใช้ (ซึ่งปกติแล้วฉันจะผ่านบรรทัดคำสั่งเมื่อฉันทดสอบสคริปต์)
ฉันจะส่งผ่านข้อโต้แย้งนี้ทุกครั้งที่สคริปต์รันเมื่อโหลดหน้าเว็บได้อย่างไร
คำตอบ:
สันนิษฐานว่าคุณกำลังส่งข้อโต้แย้งในบรรทัดคำสั่งดังนี้:
php /path/to/wwwpublic/path/to/script.php arg1 arg2
... จากนั้นเข้าถึงสคริปต์ดังกล่าว:
<?php
// $argv[0] is '/path/to/wwwpublic/path/to/script.php'
$argument1 = $argv[1];
$argument2 = $argv[2];
?>
สิ่งที่คุณต้องทำเมื่อส่งอาร์กิวเมนต์ผ่าน HTTP (การเข้าถึงสคริปต์ผ่านเว็บ) กำลังใช้สตริงข้อความค้นหาและเข้าถึงสคริปต์ผ่าน $ _GET superglobal:
ไปที่http://yourdomain.com/path/to/script.php?argument1=arg1&argument2=arg2
... และการเข้าถึง:
<?php
$argument1 = $_GET['argument1'];
$argument2 = $_GET['argument2'];
?>
หากคุณต้องการให้สคริปต์ทำงานไม่ว่าคุณจะโทรจากที่ใด (บรรทัดคำสั่งหรือจากเบราว์เซอร์) คุณจะต้องการสิ่งต่อไปนี้:
แก้ไข:ตามที่ Cthulhu ชี้ให้เห็นในความคิดเห็นวิธีที่ตรงที่สุดในการทดสอบสภาพแวดล้อมที่คุณกำลังเรียกใช้คือการใช้ค่าคงที่PHP_SAPI ฉันได้อัปเดตรหัสตาม:
<?php
if (PHP_SAPI === 'cli') {
$argument1 = $argv[1];
$argument2 = $argv[2];
}
else {
$argument1 = $_GET['argument1'];
$argument2 = $_GET['argument2'];
}
?>
empty($_GET)
ผมจะใช้ $_GET
เป็นค่าที่กำหนดไว้ล่วงหน้าดังนั้นฉันค่อนข้างมั่นใจว่ามันจะถูกตั้งค่าเสมอ แต่ว่างเปล่าหากไม่มีการตั้งค่าพารามิเตอร์ GET empty()
ส่งคืนfalse
สตริงว่างและอาร์เรย์
$_GET
ในความเป็นจริงไม่ได้ตั้งค่าถ้าสคริปต์ถูกเรียกในบริบทของบรรทัดคำสั่ง empty()
จะทำให้มันมองหาอาร์กิวเมนต์บรรทัดคำสั่งหากสคริปต์มีการเข้าถึงจากเว็บโดยไม่ต้องสตริงแบบสอบถามจึงโยนประกาศเพิ่มเติม
PHP_SAPI === 'cli'
แต่วิธีการที่เหมาะสมในการเช็คอินคือ
.htaccess
เป็นไฟล์ Apache - Apache ประมวลผลคำขอขาเข้าพร้อมกับคำสั่ง.htaccess
แล้วเรียกใช้ PHP เพื่อสร้างการตอบสนองต่อคำขอ ดังนั้นหากคุณอยู่ในบรรทัดคำสั่ง.htaccess
จะถูกละเว้นอย่างสมบูรณ์ หากคุณกำลังเข้าถึงสคริปต์ผ่านทางเว็บและคุณต้องการที่จะเพิ่มmod_rewrite
ข้อโต้แย้งสตริงการสืบค้นใหม่หลังจากที่ได้รับการร้องขอที่ทำโดยปกติจะมี หากนั่นยังไม่เพียงพอที่จะตอบคำถามของคุณฉันขอแนะนำให้คุณโพสต์คำถามใหม่
$argv[0]; // the script name
$argv[1]; // the first parameter
$argv[2]; // the second parameter
หากคุณต้องการให้สคริปต์ทั้งหมดทำงานไม่ว่าคุณจะโทรจากที่ใด (บรรทัดคำสั่งหรือจากเบราว์เซอร์) คุณจะต้องการสิ่งต่อไปนี้:
<?php
if ($_GET) {
$argument1 = $_GET['argument1'];
$argument2 = $_GET['argument2'];
} else {
$argument1 = $argv[1];
$argument2 = $argv[2];
}
?>
เพื่อโทรจากบรรทัดคำสั่งchmod 755 /var/www/webroot/index.php
และใช้
/usr/bin/php /var/www/webroot/index.php arg1 arg2
ในการโทรจากเบราว์เซอร์ให้ใช้
http://www.mydomain.com/index.php?argument1=arg1&argument2=arg2