我有一个文件Notification.php
,这是一个类。它的结构是这样的:
Class Notificaiton
{
public function sendNotification($token,$count)
{
// Here is the code for sending push notification(APNS)
}
}
通常,如果我想从另一个PHP文件调用此函数,那么我必须创建一个类的对象,然后调用它的方法如下:
$notification = new Notification();
$notification->sendNotification($token,$value);
但我想做的是在后台进程中调用它。所以我使用exec()
命令如下:
exec("/usr/bin/php /path/to/Notification.php >> /path/to/log_file.log 2>&1 &");
我想知道如何调用function(sendNotificaiton())
的{{1}}并将参数作为参数传递:$ token和$ count?
我发现file(Notification.php)
可以帮助我。但在这种情况下,我用这三个命令中的哪个命令?
请指导我。任何帮助将不胜感激。
答案 0 :(得分:6)
最好再创建一个php文件并调用其中的方法。喜欢
notificationCall.php:
<?php
include 'notification.php';
$token = $argv[1];
$count = $arg2[2];
$notification = new Notification();
$notification->sendNotification($token,$count);
?>
exec(“/ usr / bin / php /path/to/notificationCall.php令牌计数&gt;&gt; /path/to/log_file.log 2&gt;&amp; 1&amp;”);
答案 1 :(得分:2)
将构造方法添加到Notification类,如下所示:
function __construct() {
if(isset($_GET['action']) && $_GET['action']=='sendnotification') {
$this->sendNotification();
}
}
然后运行你的exec命令:
exec("/usr/bin/php /path/to/Notification.php?action=sendnotification >>
/path/to/log_file.log 2>&1");
$ token和$ count也可以作为exec命令中的GET参数提供。
答案 2 :(得分:2)
我宁愿没有单独的脚本来调用命令行执行。
<强> testNotification.php 强>
<?php
include_once 'Notification.php';
use Bubba\Util\Notification;
$Notification = new Notification();
$Notification->sendNotification('some1token', 33);
这假设我们的Notification类文件位于同一目录中,但预计它将位于无法通过Web访问的库目录中。
<强> Notification.php 强>
<?php
namespace Bubba\Util;
if (Notification::isCommandLineInterface()){
$shortopts = "";
$shortopts .= "t:"; // The Token, Required value
$shortopts .= "c:"; // The Count, Required value
$options = getopt($shortopts);
$Notification = new Notification();
$Notification->sendNotification($options['t'], $options['c']);
exit;
}
class Notification {
protected $_token;
protected $_count;
public function __construct() {
}
public function sendNotification($token = NULL, $count = NULL){
$this->setCount($count);
$this->setToken($token);
// If we are running from the command line
// then we just want to send the notification
if ($this->isCommandLineInterface()){
print "I am notifying you with [{$this->_token}] that the count is [{$this->_count}]\n";
}else{
$cmd = '/usr/bin/php ' . __FILE__ . " -t='{$this->_token}' -c={$this->_count} >> notification.log 2>&1 &";
exec($cmd );
}
}
/**
* Do some appropo validation, you don't want stuff injected
* @param string $token
*/
protected function validateToken($token){
if (empty($token) || !is_string($token)){
$this->_token = NULL;
}
}
/**
* Do some appropo validation, you don't want stuff injected
* @param string $token
*/
protected function validateCount($count){
if (empty($count) || !is_numeric($count)){
$this->_count = 0;
}
}
/**
* Determine if this is running on the command line or not.
* @return boolean
*/
public static function isCommandLineInterface(){
return (php_sapi_name() === 'cli');
}
/**
* @return the $_token
*/
public function getToken() {
return $this->_token;
}
/**
* @return the $_count
*/
public function getCount() {
return $this->_count;
}
/**
* @param NULL $_token
*/
public function setToken($_token) {
$this->validateToken($_token);
$this->_token = $_token;
}
/**
* @param number $_count
*/
public function setCount($_count) {
$this->validateCount($_count);
$this->_count = $_count;
}
}
在这种情况下,您只能浏览到http://your.localhost.net/testNotification.php,testNotification将实例化Notification对象,并调用notify函数。 notify函数将意识到它不是CLI调用,因此它将立即调用exec并返回。 exec调用将加载Notifcation.php文件,并意识到它正在从CLI运行,因此它将实例化自己,获取适当的命令行选项,发送通知,然后退出。
您可以通过使用相应的通知消息在同一目录中注意到新的notification.log来验证这一点。
答案 3 :(得分:1)
你的例子非常简单,也许这就是用火箭筒杀死一只苍蝇但是如下:http://www.gearman.org/或http://www.rabbitmq.com/。这些服务非常适合在后台运行。
答案 4 :(得分:1)
在使用Linux网络服务器的CPanel中,我使用了以下代码
A)
/usr/bin/php -q /home/username/public_html/path/to/Notification.php
和 B)
lynx --dump http://yourlink.com/path/to/Notification.php > /path/to/log_file.log
对于我来说,在某些服务器中使用方法A,在某些服务器中使用方法B.您可以尝试这两种方法。我希望它可以帮助你。