Ei kuvausta

HttpService.php 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Services;
  3. use App\Support\EmailQueue;
  4. use App\Support\Log;
  5. class HttpService
  6. {
  7. /**
  8. * 封装HTTP请求 -- POST
  9. * @param $url
  10. * @param null $data
  11. * @param bool $json
  12. * @param null $headers
  13. * @return bool|string
  14. */
  15. public static function httpPost($url, $data = null, $json = FALSE, $headers = null){
  16. //创建了一个curl会话资源,成功返回一个句柄;
  17. $curl = curl_init();
  18. //设置url
  19. curl_setopt($curl, CURLOPT_URL, $url);
  20. //设置为FALSE 禁止 cURL 验证对等证书(peer’s certificate)
  21. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  22. //设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)
  23. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  24. if (!empty($data)){
  25. //设置请求为POST
  26. curl_setopt($curl, CURLOPT_POST, 1);
  27. //curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60); //最长的可忍受的连接时间
  28. //设置POST的数据域
  29. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  30. if($json){
  31. $header = array(
  32. 'Content-Type: application/json; charset=utf-8',
  33. 'Content-Length: ' . strlen($data)
  34. );
  35. if(!empty($headers)) {
  36. $header = array_merge($header, $headers);
  37. }
  38. curl_setopt($curl, CURLOPT_HEADER, 0);
  39. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  40. }
  41. }
  42. //设置是否将响应结果存入变量,1是存入,0是直接输出
  43. curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  44. //然后将响应结果存入变量
  45. $output = curl_exec($curl);
  46. //关闭这个curl会话资源
  47. curl_close($curl);
  48. return $output;
  49. }
  50. /**
  51. * 封装HTTP请求 -- GET
  52. * @param $url
  53. * @param null $headers
  54. * @return bool|string
  55. */
  56. public static function httpGet($url, $headers = null){
  57. $curl = curl_init(); // 启动一个CURL会话
  58. curl_setopt($curl, CURLOPT_URL, $url);
  59. curl_setopt($curl, CURLOPT_HEADER, 0);
  60. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  61. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
  62. if ($headers) {
  63. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 设置请求的header
  64. }
  65. $output = curl_exec($curl); //返回api的json对象
  66. //关闭URL请求
  67. curl_close($curl);
  68. return $output; //返回json对象
  69. }
  70. /**
  71. * 封装HTTP请求 -- 通过图片全路径上传图片
  72. * */
  73. public static function httpUpload($url, $filePath, $retry=0)
  74. {
  75. if(strstr($filePath, '../') !== false) {
  76. $filePath = public_path($filePath);
  77. }
  78. $file_data = array("media" => new \CURLFile($filePath));
  79. $curl = curl_init();
  80. curl_setopt($curl , CURLOPT_URL , $url);
  81. curl_setopt($curl , CURLOPT_RETURNTRANSFER, 1);
  82. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
  83. curl_setopt($curl , CURLOPT_POST, 1);
  84. curl_setopt($curl , CURLOPT_POSTFIELDS, $file_data);
  85. $output = curl_exec($curl);
  86. $responseData = json_decode($output, true);
  87. if ($output === FALSE || !isset($responseData['errcode'])){
  88. Log::error('上传图片HTTP请求失败', [
  89. 'error' => curl_error($curl),
  90. 'url' => $url,
  91. 'path' => $filePath,
  92. 'retry' => $retry
  93. ], 'HttpUploadError');
  94. if($retry<=5) { // 发起重试
  95. sleep(1);
  96. $retry++;
  97. return self::httpUpload($url, $filePath, $retry);
  98. } else { // 报警
  99. EmailQueue::rPush('图片全路径上传失败', curl_error($curl), ['xiaohua.hou@kuxuan-inc.com'], '图片全路径上传失败');
  100. }
  101. }
  102. curl_close($curl);
  103. return $output;
  104. }
  105. }