如何在另一PHP文件中调用Telegram API解码后的JSON数据?
问题分析
直接通过include/require主文件无法获取解码后的数据,核心原因有两个:
- 当第二个文件引入主文件时,主文件会重新执行所有代码——如果第二个文件并非直接接收Telegram的POST请求,
php://input会是空值,导致$update为null。 - 即使是同一个请求,
php://input只能被读取一次,主文件已经读取后,第二个文件再调用file_get_contents("php://input")会拿不到数据。
解决方案
以下是三种可行的实现方式,按代码规范性排序:
方案一:模块化封装推荐
把Telegram更新的获取、解码逻辑抽成独立文件,通过静态变量缓存结果,避免重复读取和解析:
1. 创建telegram-handler.php
<?php date_default_timezone_set("Asia/Tehran"); // 静态变量缓存已解析的更新,避免重复读取php://input static $cachedUpdate = null; static $cachedApiUrl = null; if ($cachedUpdate === null) { $input = file_get_contents("php://input"); file_put_contents('result.txt', $input . PHP_EOL . PHP_EOL, FILE_APPEND); $cachedUpdate = json_decode($input, true); $cachedApiUrl = "https://api.telegram.org/bot" . API_TOKEN . "/"; } // 提供全局可调用的变量 $update = $cachedUpdate; $api_url = $cachedApiUrl;
2. 主文件引用
<?php require 'functions.php'; require 'telegram-handler.php'; // 直接使用$update和$api_url即可
3. 第二个文件引用
<?php // 注意路径正确性,推荐用绝对路径避免问题 require __DIR__ . '/../telegram-handler.php'; // 直接使用$update变量
方案二:函数返回结果
通过函数封装逻辑,调用时获取解析后的更新:
1. 创建telegram-functions.php
<?php date_default_timezone_set("Asia/Tehran"); function getTelegramUpdate() { static $update = null; if ($update === null) { $input = file_get_contents("php://input"); file_put_contents('result.txt', $input . PHP_EOL . PHP_EOL, FILE_APPEND); $update = json_decode($input, true); } return $update; } function getTelegramApiUrl() { return "https://api.telegram.org/bot" . API_TOKEN . "/"; }
2. 主文件调用
<?php require 'functions.php'; require 'telegram-functions.php'; $update = getTelegramUpdate(); $api_url = getTelegramApiUrl();
3. 第二个文件调用
<?php require __DIR__ . '/../telegram-functions.php'; $update = getTelegramUpdate(); // 使用$update处理逻辑
方案三:全局变量快速解决不推荐,耦合性高
在主文件中将$update声明为全局变量,第二个文件引入后直接调用:
1. 修改主文件
<?php require 'functions.php'; date_default_timezone_set("Asia/Tehran"); $input = file_get_contents("php://input"); file_put_contents('result.txt', $input . PHP_EOL . PHP_EOL, FILE_APPEND); // 声明全局变量 global $update; $update = json_decode($input, true); $api_url = "https://api.telegram.org/bot" . API_TOKEN . "/";
2. 第二个文件调用
<?php include '../main.php'; // 引入全局变量 global $update; // 使用$update变量
注意事项
- 确保
API_TOKEN在所有引用的文件中可访问,比如将其定义在functions.php或独立的配置文件中。 - 引用文件时优先使用绝对路径(如
__DIR__拼接路径),避免相对路径导致的文件找不到问题。
内容的提问来源于stack exchange,提问作者Parsa Rasouli
相关产品推荐
相关产品推荐

