2

我有一个文件,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())file(Notification.php)传递参数作为参数: $token 和 $count ?

我发现这exec/shell_exec/passthru commands可以帮助我。但是在这种情况下,我使用了这三个命令中的哪个命令?

请指导我。任何帮助将不胜感激。

4

5 回答 5

6

最好再创建一个 php 文件并调用其中的方法。像

通知呼叫.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 令牌计数 >> /path/to/log_file.log 2>&1 &");

于 2013-09-04T11:40:57.993 回答
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 参数提供。

于 2013-09-10T14:07:12.503 回答
2

我宁愿没有单独的脚本来调用命令行执行。

testNotification.php

<?php
include_once 'Notification.php';
use Bubba\Util\Notification;

$Notification = new Notification();
$Notification->sendNotification('some1token', 33);

这假设我们的 Notification 类文件位于同一目录中,尽管预计它会位于无法通过 Web 访问的库目录中。

通知.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 来验证这一点。

于 2013-09-10T16:30:22.247 回答
1

你的例子很简单,也许这是用火箭筒杀死一只苍蝇,但是怎么样:http://www.gearman.org/http://www.rabbitmq.com/。这些服务非常适合在后台运行东西。

于 2013-09-08T22:13:51.953 回答
1

在带有 linux Web 服务器的 CPanel 中,我使用了以下代码

一种)

/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。您可以尝试两种方法。我希望它对你有帮助。

于 2013-09-09T13:06:19.100 回答