导航:首页 > 编程语言 > phpcurlposthttps

phpcurlposthttps

发布时间:2023-06-07 12:51:54

A. php使用CURL请求https的微信统一下单接口时报错,同样的代码我在另一台机器上运行是正常的

我也遇到了同样的问题,只要是走微信,偶尔都会请求不到,原来是正常的。今天排查了一天,终于找到了原因所在。

centos原生用的NSS,而不是OpenSSL,curl调用NSS库请求https时偶尔会出现请求不到的情况。

解决方案:
参考网址:网页链接

按步骤完成后记得重启 php-fpm和nginx

B. php如何上传图片到远程服务器

可以使用curl这个扩展来实现。
PHP 支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
curl_close() 关闭一个cURL会话。
curl__handle()复制一个cURL句柄和它的所有选项。
curl_errno()返回最后一次的错误号。
curl_error()返回一个保护当前会话最近一次错误的字符串。
curl_escape()返回转义字符串,对给定的字符串进行URL编码。
curl_exec()执行一个cURL会话。
curl_file_create()创建一个CURLFile对象。
curl_getinfo()获取一个cURL连接资源句柄的信息。
curl_init()初始化一个cURL会话。
curl_multi_add_handle()向curl批处理会话中添加单独的curl句柄。
curl_multi_close()关闭一组cURL句柄。
curl_multi_exec()运行当前cURL句柄的子连接
curl_multi_getcontent()如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。
curl_multi_info_read()获取当前解析的cURL的相关传输信息。
curl_multi_init()返回一个新cURL批处理句柄。
curl_multi_remove_handle()移除curl批处理句柄资源中的某个句柄资源。
curl_multi_select()等待所有cURL批处理中的活动连接。
curl_multi_setopt()设置一个批处理cURL传输选项。
curl_multi_strerror()返回描述错误码的字符串文本。
curl_pause()暂停及恢复连接。
curl_reset()重置libcurl的会话句柄的所有选项。
curl_setopt_array()为cURL传输会话批量设置选项。
curl_setopt()设置一个cURL传输选项。
curl_share_close()关闭cURL共享句柄。
curl_share_init()初始化cURL共享句柄。
curl_share_setopt()设置一个共享句柄的cURL传输选项。
curl_strerror()返回错误代码的字符串描述。
curl_unescape()解码URL编码后的字符串。
curl_version()获取cURL版本信息。

C. PHP curl 模拟表单数据流multipart/form-data上传文件

在调用公众号接口https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token."&type=".$type;

上传永久素材文件总是返回 "{\"errcode\":41005,\"errmsg\":\"media data missing\"}"

经过多次测试使用下面的方式,可以正常上传

//调用测试

protected static $url;

protected static $delimiter;

protected static $instance;

public function index()

{

        static::$delimiter = uniqid();

$basename = Request::instance()->root();

if (pathinfo($basename, PATHINFO_EXTENSION) == 'php') {

    $basename = dirname($basename);

}

        $result=$this->wxAddMaterial($token,$basename.'/upload/images/gnlog.jpg','image');

    }

// 新增其他类型永久素材

public function wxAddMaterial($token,$filename='',$type='') {

    // 设置请求参数

    static::$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token."&type=".$type;

    $filePath = str_replace('\\', '/', $filename);

    // 发送请求

    $imginfo=pathinfo($filePath);

    $fields = array(

        'media'=>扒槐file_get_contents(".".$filePath),

        'filename'=>$imginfo["basename"茄此嫌],

);

    $res = $this->putPart( $fields);

    // 发送请求

    return $res;

}

//推送文件流

public function putPart($param) {

    $post_data = static::buildData($param);

    $curl = curl_init(static::$url);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($curl, CURLOPT_POST, true);

    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);

    curl_setopt($curl, CURLOPT_HTTPHEADER, [

        "Content-Type: multipart/form-data; boundary=" . static::$delimiter,

        "Content-Length: " . strlen($post_data)

]);

    $response = curl_exec($curl);

    curl_close($curl);

    return $response;

}

//编译请求头格式和数据流

private static function buildData($param){

    $data = '';

    $eol = "\r\n";

    $upload = $param['media'];

    unset($param['media']);

    foreach ($param as $name => $content) {

        $data .= "--" . static::$delimiter . "\r\颤手n"

            . 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"

            . $content . "\r\n";

}

    $data .= "--" . static::$delimiter . $eol

        . 'Content-Disposition: form-data; name="media"; filename="' . $param['filename'] . '"' . "\r\n"

        . 'Content-Type:application/octet-stream'."\r\n\r\n";

    $data .= $upload . "\r\n";

    $data .= "--" . static::$delimiter . "--\r\n";

    return $data;

}

根据自己的实际情况稍作修改

D. 如何通过php的curl模拟ajax请求,获取其返回值

这个需要配合js,打开一个html页面,首先js用ajax请求页面,返回第一个页面信息确定处理完毕(ajax有强制同步功能),ajax再访问第二个页面。(或者根据服务器状况,你可以同时提交几个URL,跑几个相同的页面)
参数可以由js产生并传递url,php后台页面根据URL抓页面。然后ajax通过php,在数据库或者是哪里设一个标量,标明检测到哪里。由于前台的html页面执行多少时候都没问题,这样php的内存限制和执行时间限制就解决了。
因为不会浪费大量的资源用一个页面来跑一个瞬间500次的for循环了。(你的500次for循环死了原因可能是获取的数据太多,大过了php限制的内存)
不过印象中curl好像也有强制同步的选项,就是等待一个抓取后再执行下一步。但是这个500次都是用一个页面线程处理,也就是说肯定会远远大于30秒的默认执行时间。

E. 对于https协议的网站,可以用php 的curl来模拟get请求和post请求吗,能得到返回值吗

可以。
CURLOPT_PROTOCOLS
CURLPROTO_* 的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见 CURLOPT_REDIR_PROTOCOLS .
可用的协议选项为:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL

对了,可定能得到返回值

阅读全文

与phpcurlposthttps相关的资料

热点内容
静态编译失败的原因 浏览:233
西安人社app为什么注册不了 浏览:24
linux下root密码修改 浏览:699
苹果11watchapp有什么用 浏览:471
linux文件系统集群 浏览:747
大奥电视剧观看顺序 浏览:478
深圳程序员真实工资是多少 浏览:517
androidgetbytes 浏览:706
争鸣pdf 浏览:968
饥荒联机版如何直连服务器 浏览:121
妈妈的朋友崇石演过什么电影 浏览:868
qq邮箱如何查看服务器的地址 浏览:800
穿越到各大电影世界 浏览:584
青海集群服务器云空间 浏览:924
韩剧不能看有什么app可以代替 浏览:585
用气球和黏土做解压玩具 浏览:187
天地23tⅹt 浏览:784
恐怖电影观看免费推荐 浏览:4
共享电影 浏览:666
杰友科技是什么app 浏览:581