繁体   English   中英

从 PHP Cron Job 中调用 JSON API

[英]Call JSON API from within PHP Cron Job

我有一个带有 API 的大型系统。 在前端,JavaScript 使用 AJAX 与 API 对话。

我有一个 PHP 文件,它作为 CRON 作业每 5 分钟运行一次。 我希望这个 PHP 代码与 API 交互。 它必须提交的只是查询变量。 发回的只是一个数字。

例如: https://examplesite.com/api/create?id=1&data=2这会回复一个简单的数字,即 SQL last-insert-id。

EXTRA: The API also needs two Session variables (user-id and system-id) Can I just start session and set them before calling the API I guess? 我需要由 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。

谢谢。

假设您仍想使用 session。 您的第一个 curl 应该是对将创建 SESSION 然后响应的脚本的请求。

我创建了这个 get_cookie.php 来测试这个概念:

<?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、session.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 中的时间相同。

感谢您的帮助,但最终我的替代方法将是最简单且效果最好的。 这是其他有需要的人的答案...

To have an external PHP (run via CRON) test an internal PHP API (that the frontend JavaScript usually talks to via AJAX), this is the easiest solution, including passing query-variables and session-vars.

第 1 步:不要担心 start_session() 或传递任何查询变量,只需提前将所需内容添加到 arrays 即可。

第 2 步:捕获 output 缓冲区并简单地包含 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 必须与网站/api 位于同一服务器上,否则您将不得不将 cURL 与 Cookie/Session/QueryVar-Arrays 一起使用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM