PHP脚本中的卷曲请求通过浏览器而不是CRON来工作



我知道这有问题,但到目前为止,没有什么可以帮助我解决问题。

我有一个PHP脚本,其工作是发送计划的电子邮件。它通过调用我通过卷曲来控制的Web服务来实现此目的。

在浏览器中运行,效果很好。通过cron运行,卷曲响应是空的。它永远不会达到Web服务;我知道这是因为我有WS在联系时写了一个文本文件。如果您可以通过浏览器访问,而不是通过Cron访问。

我知道Cron在不同的环境中运行,我不依赖任何环境Vars,例如$_SERVERrequire()的路径也不是问题,因为它成功地将数据从该文件中获取到DB。

这个问题建议添加以下卷曲选择,但我已经完成了,但没有骰子:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

这是我的php脚本:

//prep
define('WS_URL', 'http://mywebservicedomain.com/index.php/web_service');
require '../application/config/database.php';
$db = new mysqli($db['default']['hostname'], $db['default']['username'], $db['default']['password'], $db['default']['database']) or die('failed to connect to DB');
//get scheduled e-mails
$res = $db->query('SELECT * FROM _cron_emails WHERE send_when < NOW()');
//process each...
while ($email_arr = $res->fetch_assoc()) {
    //...get API connection info
    $api_accnt = $db->query($sql = 'SELECT id, secret FROM _api_accounts WHERE project = "'.$email_arr['project'].'"');
    $api_accnt = $api_accnt->fetch_assoc();
    //...recreate $_POST env
    $tmp = json_decode($email_arr['post_vars'], 1);
    $_POST = array();
    foreach($tmp as $key => $val) $_POST[$key] = !is_array($val) ? $val : implode(',', $val);
    //...call API to send e-mail
    $ch = curl_init($url = WS_URL.'/send_scheduled_email/'.$email_arr['email_id'].'/'.$email_arr['store_id'].'/'.$email_arr['item_id']);
    curl_setopt_array($ch, array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_SAFE_UPLOAD => true,
        CURLOPT_SSL_VERIFYHOST => 1, //<-- tried adding this
        CURLOPT_SSL_VERIFYPEER => 1, //<-- ditto
        CURLOPT_POSTFIELDS => array_merge($_POST, array(
            'api_key' => $api_accnt['id'],
            'api_secret' => $api_accnt['secret'],
        ))
    ));
    $resp = curl_exec($ch); //<-- empty when CRON
    //if e-mail was sent OK, or decider script said it was ineligible, delete it from the queue
    if (($resp == 'ok' || $resp == 'ineligible'))
        $db->query('DELETE FROM _cron_emails WHERE id = '.$email_arr['id'].' LIMIT 1');
}

有人知道为什么只有在Cron运行时才能通过卷发连接到我的Web服务?

这是Cron的工作:

/usr/bin/php /home/desyn/public_html/cron/send_scheduled_emails.php

最后,这是一个非常特别的,我认为并不常见,问题。我怀疑这会证明对他人有太多帮助,但我将其留在这里。

本质上,我的服务器不喜欢通过域进行卷曲。

Cron脚本中的Curl调用服务器与CRON任务运行的服务器相同(但是一个不同的帐户和网站。)

这并不是通过浏览器证明这是一个问题;仅通过cron。

更改使用服务器的本地IP而不是使用域的卷曲请求解决此问题。

相关内容

  • 没有找到相关文章

最新更新