curl 从PHP Cron Job中调用JSON API

nkoocmlb  于 2023-01-02  发布在  PHP
关注(0)|答案(2)|浏览(148)

我有一个带有API的大型系统。在前端,JavaScript使用AJAX与API对话。
我有一个PHP文件,作为CRON作业每5分钟运行一次。我想让这个PHP代码与API交互。它需要提交的只是query-vars。返回的只是一个数字。
例如:https://examplesite.com/api/create?id=1&data=2这个函数用一个简单的数字作为响应,这个数字就是SQL的last-insert-id。
额外:API还需要两个Session变量(user-id和system-id)我想我可以在调用API之前启动session并设置它们吗?我需要由CRON系统运行的PHP脚本来与此API对话。
我试过使用cURL,但还没有运气:

//Need to add a user-id to session, does this work?
        session_start();
        $_SESSION['user-id'] = 1;

        //HOW TO CALL API FROM CRON?
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($ch, CURLOPT_URL, 'https://example.com/api/create?id=1&gid=2');
        //curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/create?id=1&gid=2');
        curl_setopt($ch, CURLOPT_URL, 'file://../framework/api/create.php?id=1&data=2');

        $result = curl_exec($ch);
        curl_close($ch);
        
        $result = str_replace("\n", '', $result); // remove new lines
        $result = str_replace("\r", '', $result); // remove carriage returns
        
        //Expect Result to be a number only
        file_put_contents("curl.log", "[".date('Y-m-d H:i:s')."] $result\n\n", FILE_APPEND);

文件方法似乎不起作用...可能是路径问题../http方法似乎不起作用...服务器回送问题?
任何关于如何最好地让我的PHP CRON机器人使用我的API的建议都将非常感谢。我只是简单地将API代码复制到CRON中,但随后我复制了代码,不允许机器人测试真正的API。
谢谢。

sbdsn5lh

sbdsn5lh1#

假设你仍然想使用会话,你的第一个curl应该是一个请求,一个脚本将创建会话,然后响应。
我创建了这个get_cookie. php this来测试这个概念:

<?php
session_start();
$_SESSION['time'] = time();
echo 'Time=' . $_SESSION['time'];
?>

我调用此脚本是为了从响应cookie中获取PHPSESSID

$ch = curl_init('http://example.com/get_cookie.php');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

$skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
$head = substr($response,0,$skip);
$data = substr($response,$skip);
$end = 0;
$start = strpos($head,'Set-Cookie: ',$end);
$start += 12;
$end = strpos($head,';',$start );
$cookie = substr($head,$start ,$end-$start );
file_put_contents('cookie.txt',$cookie);
echo "\ncookie=$cookie";
echo "\n$data\n";

回复:

cookie=PHPSESSID=bc65c95468d08dd02cc5ab8ab87bbd39
Time=1664237484

CRON作业URL,会话.php:

<?php
session_start();
echo 'Time=' . $_SESSION['time'];
?>

这是CRON作业脚本。

$cookie = file_get_contents('cookie.txt');
$ch = curl_init('http://example.com/session.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie );
curl_setopt($ch, CURLOPT_HEADER, false);
$response = curl_exec($ch);
echo $response;

回复:

Time=1664237484

结果"Time" ($_SESSION['TIME'])总是与get_cookie. php中的时间相同。

9bfwbjaz

9bfwbjaz2#

谢谢你的帮助,但最终我的替代方法将是最简单和最有效的。以下是给其他有需要的人的答案...
要让外部PHP(通过CRON运行)测试内部PHP API(前端JavaScript通常通过 AJAX 与之通信),这是最简单的解决方案,包括传递查询变量和会话变量。
第1步:不要担心start_session()或传递任何查询变量,只需提前将所需内容添加到数组中即可。
第2步:捕获输出缓冲区并简单地包含PHP API文件:

$_SESSION['user-id'] = ' works! ';
        $_REQUEST['var']     = ' too ';

        ob_start();
        include '/var/www/sitename.com/framework/api/create.php';
        $result = ob_get_contents();
        ob_end_clean();              

        file_put_contents("/var/www/sitename.com/cron/curl.log", "[".date('Y-m-d H:i:s')."] Result: $result\n\n", FILE_APPEND);

        /* OUTPUT in curl.log:
        [2022-09-26 22:30:01] Result:  works! / too 
        */

        /* create.php API
        $user = $_SESSION['user-id']??' did not work ';
        $req  = $_REQUEST['var'    ]??' novar ';
        echo $user.'/'.$req;
        */

(显然,CRON必须与website/API位于同一服务器上,否则您将不得不使用cURL和Cookie/Session/QueryVar-Arrays)

相关问题