本地正常的PHP CURL Telegram机器人代码,远程服务器报curl_error #26
PHP Telegram机器人sendPhoto接口部署后触发Curl错误26排查
问题描述
本地环境运行正常的Telegram机器人发送图片代码,部署到远程服务器后触发Curl错误26。已尝试设置CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER为false,问题仍未解决。
代码片段:
$img_path = "https://www.example.com/path/to/file.jpg"; $method = "sendPhoto"; $arrayQuery = array( "chat_id" => CHAT_ID, "photo" => curl_file_create($img_path, $img_mime, $img_name), "caption" => $caption, "parse_mode" => "HTML", "show_caption_above_media" => true, ); try { $ch = curl_init('https://api.telegram.org/bot'.BOT_TOKEN.'/'.$method); if ($ch === false) { throw new Exception('failed to initialize'); } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $res = curl_exec($ch); if ($res === false) { throw new Exception(curl_error($ch), curl_errno($ch)); } } catch(Exception $e) { trigger_error(sprintf( 'Curl failed with error #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR); } finally { if (is_resource($ch)) { curl_close($ch); } }
问题分析与解决方案
Curl错误26对应的是CURLE_READ_ERROR,本质是程序尝试读取要上传的文件时失败。结合代码和场景,核心问题出在**curl_file_create的用法错误**:
curl_file_create函数用于封装本地文件为CURLFile对象,专门处理本地文件上传。但你的$img_path是远程HTTPS URL,服务器环境下curl无法将远程URL当作本地文件读取,这就是触发错误26的直接原因。- 本地环境可能因特殊配置(如curl允许从URL读取文件、本地网络无障碍访问目标图片URL)暂时掩盖了问题,但服务器环境的限制会暴露这个错误。
修复代码
Telegram Bot API的sendPhoto接口本身支持直接传入远程图片URL作为photo参数,无需用curl_file_create处理。修改代码如下:
$img_path = "https://www.example.com/path/to/file.jpg"; $method = "sendPhoto"; $arrayQuery = array( "chat_id" => CHAT_ID, "photo" => $img_path, // 直接传入远程URL "caption" => $caption, "parse_mode" => "HTML", "show_caption_above_media" => true, ); // 后续curl逻辑保持不变
额外排查点(若需上传本地文件)
如果需求是上传本地图片而非远程URL,需检查:
- 服务器上图片文件的绝对路径是否正确,避免用相对路径导致找不到文件
- PHP进程是否有读取该文件的权限(建议文件权限设为644,目录权限设为755)
- 确认文件确实存在于服务器的对应路径下
内容的提问来源于stack exchange,提问作者Sashik259
相关产品推荐
相关产品推荐

