如何修复curl_exec()参数1应为资源却传入null的警告
解决
curl_exec() expects parameter 1 to be resource, null given 警告 这个警告的核心原因非常直接:你在调用curl_exec($ch)时,$ch变量并没有被初始化——它没有指向任何有效的curl资源句柄,所以是null。咱们一步步来修复这个问题,同时优化你的代码逻辑:
1. 先初始化curl资源句柄
在使用curl的任何函数之前,必须先用curl_init()创建一个curl资源。如果初始化失败,还可以做错误处理:
$ch = curl_init(); if (!$ch) { die('curl资源初始化失败,请检查服务器curl扩展是否启用'); }
2. 调整代码执行顺序
你的代码顺序存在逻辑问题:
ini_set('memory_limit', '2048M')放在curl_exec之后,对这次curl请求完全无效,应该放在代码最开头- 先调用
curl_exec再引入文件,可能导致依赖的变量(比如$just_phone、$key)还未定义,先引入依赖文件再处理逻辑更合理
3. 配置curl请求的必要参数
既然你要向API提交表单数据,需要设置curl的URL、请求方法、POST数据、返回结果等选项,比如:
// 设置API地址 curl_setopt($ch, CURLOPT_URL, '你的API接口地址'); // 设置为POST请求 curl_setopt($ch, CURLOPT_POST, true); // 设置POST的JSON数据 curl_setopt($ch, CURLOPT_POSTFIELDS, $request_params); // 设置请求头,告诉服务器提交的是JSON格式 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($request_params) ]); // 让curl返回结果而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
4. 优化时间格式化逻辑
你重复计算了多次时间戳,建议先统一计算一次,避免冗余:
// 计算偏移后的时间戳(提前10800秒) $offsetTimestamp = time() - 10800; // 格式化日期部分 $datePart = date('Y-m-d', $offsetTimestamp); // 格式化时间部分(保留你原来的时间偏移逻辑) $timePart = date('H:i', time() - 10680); // 组合成ISO格式时间 $isoTime = "{$datePart}T{$timePart}:00Z";
完整修正后的代码
<?php // 先设置内存限制 ini_set('memory_limit', '2048M'); // 引入依赖文件 require('/home/users/m/xxx/domains/xxx.ru/a.php'); require('/home/users/m/xxx/domains/xxxy.ru/b.php'); // 初始化curl资源 $ch = curl_init(); if (!$ch) { die('curl初始化失败,请检查服务器curl扩展状态'); } if ($just_phone && $key) { echo "yes"; // 计算格式化后的时间 $offsetTimestamp = time() - 10800; $datePart = date('Y-m-d', $offsetTimestamp); $timePart = date('H:i', time() - 10680); $isoTime = "{$datePart}T{$timePart}:00Z"; // 用json_encode构造JSON参数,比手动拼接更安全 $request_params = json_encode([ 'form_id' => 511175, 'fields' => [ ['id' => 4, 'value' => $just_phone], ['id' => 23, 'value' => $isoTime], ['id' => 6, 'value' => $isoTime] ] ]); // 配置curl选项 curl_setopt($ch, CURLOPT_URL, '替换成你的API接口地址'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $request_params); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($request_params) ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并处理结果 $response = curl_exec($ch); if ($response === false) { echo 'curl请求失败:' . curl_error($ch); } else { // 可以在这里处理API返回的结果 echo '请求成功,返回结果:' . $response; } } // 关闭curl资源 curl_close($ch); ?>
额外注意点
- 确保服务器已经启用了curl扩展,可以通过
phpinfo()查看 - 用
json_encode()构造JSON参数比手动拼接更安全,避免出现语法错误 - 记得替换代码中的
你的API接口地址为实际的API URL
内容的提问来源于stack exchange,提问作者loki
相关产品推荐
相关产品推荐

