分类目录归档:开发技术&电脑使用

记录开发相关的文章

PHP Carbon时区操作

在没有指定时区的时候,系统是以date_default_timezone_get 获取到的时区在进行转换。
如果我们要为某个时间单独指定时区的话,可以按以下的方式。

// 没有指定时间前
var_dump(Carbon::parse('now')->toDateTimeString());

// 实例化一个时区对象
$tz = new CarbonTimeZone('+08:00');
// 在解析的时候,把时区带上
var_dump(Carbon::parse('now', $tz)->toDateTimeString());

 

CentOS 7 编译安装Redis和RediSearch

安装Redis

安装gcc
yum install gcc

从 https://redis.io/ 下载最新的代码,解压进入

执行: make 报如下错误:
找不到“jemalloc/jemalloc.h”,我们换一种分配内存的方式
make MALLOC=libc

把redis安装到: /usr/local/redis6 目录
make PREFIX=/usr/local/redis6 install

把配置文件复制到/etc/redis.conf
cp redis.conf /etc/redis.conf

把 protected-mode yes 改成 protected-mode no
注释掉:bind 127.0.0.1 -::1

安装RediSearch

下载 代码,解压,报错

make setup
deps/readies/mk/main:6: *** GNU Make version is too old. Aborting.。 停止。

去https://www.gnu.org/software/make/ 下载最新的代码,解压,

./configure
make

生成的可执行文件make会在当前目录,后面直接用这个make就行了,不用安装,

去RedisSearch目录
../make-4.3/make setup
../make-4.3/make build

修改redis.conf,增加:loadmodule /usr/local/redis6/bin/redisearch.so

启动Redis
redis-server /etc/redis.conf

PHP在进程相关的笔记

exec和pcntl_exec的区别

echo "开始执行\n";
pcntl_exec('/usr/bin/php', ['-r', 'sleep(10);']);

// 等待10秒后,程序结束
// 这行代码不会被执行
echo "PHP代码结束\n";

exec是在当前进程里新开了一个进程,并等待新进程执行完后再接着执行,新开进程的进程号和当前进程号不同。

pcntl_exec不新开进程,在当前进程接着执行,pcntl_exec后面的php代码不再被执行,接收不到输出。

进程信号处理

常用信号:

代码 数值 说明 操作
HUP 1 通常是重启、加载配置文件
INT 2 终端中断 Ctrl – C
QUIT 3 终端退出 Ctro – \
KILL 9 强制中断,信息不能被捕获
ALRM 14 警告
TERM 15 终止运行,会生成dump?
CONT 18 恢复执行
STOP 19 暂停执行
<?php
declare(ticks = 1);
$run = true;

function signal_handler($signal) {
    global $run;
    print "Caught SIGALRM: {$signal}\n";

    switch ($signal) {
        case SIGHUP:
            # 重新加载
            break;

        case SIGINT:
        case SIGQUIT:
            $run = false;
            break;
        
        default:
            # code...
            break;
    }
}

pcntl_signal(SIGHUP, "signal_handler");
pcntl_signal(SIGINT, "signal_handler");
pcntl_signal(SIGQUIT, "signal_handler");

while ($run) {
    sleep(1);
}

echo "end.";

注意啊,这东西不能在VS Code的控制台下运行,不然中断回调函数不会被执行。

 

获取YouTube的博主和视频信息

有3种报表:
1、通过DataApi,这种方式相对较直接,通过调用api获取数据,也可以操作数据(需要登录验证)2、Analytics API:这个报表是实时获取。
3、Reporting API:这个是生成报表数据再异步下载的,可以批量生成,如果数据量很大的话,建议用这个。

现在我们用的是第一种方式。

打开:https://console.cloud.google.com/,建立项目。
“API和服务“里,开通”库“里的”YouTube Data API v3”
开通后会得到token,后面会需要。

在这里可以查看文档,可以方便的用他们提供的api tools进行测试。
https://developers.google.com/youtube/v3/docs

有一个比较坑人的地方是,打开测试Widget后,下面的用OAuth 2.0是默认开启的,如下图:

当把这个取消后,右边生成的代码不会改变,要在上面手动改一个参数后,才会变。
要注意这个问题,不然代码是有问题的,始终会按OAuth 2.0的方式生成。

PHP的使用教程在这里:
https://developers.google.com/youtube/v3/quickstart/php

获取博主信息

请求:
GET https://youtube.googleapis.com/youtube/v3/channels?part=snippet%2CcontentDetails%2Cstatistics&forUsername=GoogleDevelopers&key=[YOUR_API_KEY] HTTP/1.1

Authorization: Bearer [YOUR_ACCESS_TOKEN]
Accept: application/json

返回:
{
  "kind": "youtube#channelListResponse",
  "etag": "LdG9BNUGur4iY7vuvSdW3_7PNP8",
  "pageInfo": {
    "totalResults": 1,
    "resultsPerPage": 5
  },
  "items": [
    {
      "kind": "youtube#channel",
      "etag": "6MkQzgqGne9K0Ol8mcuIHT0K8HQ",
      "id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
      "snippet": {
        "title": "Google Developers",
        "description": "The Google Developers channel features talks from events, educational series, best practices, tips, and the latest updates across our products and platforms.\n\nSubscribe to Google Developers → https://goo.gle/developers\n",
        "customUrl": "googledevelopers",
        "publishedAt": "2007-08-23T00:34:43Z",
        "thumbnails": {
          "default": {
            "url": "https://yt3.ggpht.com/ytc/AAUvwngOju7AKiAvKEs1wtsZN366tyNPyMq3nD8eFkMF7bE=s88-c-k-c0x00ffffff-no-rj",
            "width": 88,
            "height": 88
          },
          "medium": {
            "url": "https://yt3.ggpht.com/ytc/AAUvwngOju7AKiAvKEs1wtsZN366tyNPyMq3nD8eFkMF7bE=s240-c-k-c0x00ffffff-no-rj",
            "width": 240,
            "height": 240
          },
          "high": {
            "url": "https://yt3.ggpht.com/ytc/AAUvwngOju7AKiAvKEs1wtsZN366tyNPyMq3nD8eFkMF7bE=s800-c-k-c0x00ffffff-no-rj",
            "width": 800,
            "height": 800
          }
        },
        "localized": {
          "title": "Google Developers",
          "description": "The Google Developers channel features talks from events, educational series, best practices, tips, and the latest updates across our products and platforms.\n\nSubscribe to Google Developers → https://goo.gle/developers\n"
        },
        "country": "US"
      },
      "contentDetails": {
        "relatedPlaylists": {
          "likes": "",
          "favorites": "",
          "uploads": "UU_x5XG1OV2P6uZZ5FSM9Ttw"
        }
      },
      "statistics": {
        "viewCount": "182712151",
        "subscriberCount": "2160000",
        "hiddenSubscriberCount": false,
        "videoCount": "5340"
      }
    }
  ]
}

 

根据用户获取视频列表,分页的时候需要注意传pageTaken参数进去,该值是该API上一次返回的,如果不传的话,是第一页。

发送:
List编号是上一个接口返回的UU开始的那个
GET https://youtube.googleapis.com/youtube/v3/playlistItems?part=contentDetails%2Csnippet%2Cstatus&playlistId=[List编号]&key=[YOUR_API_KEY] HTTP/1.1

Authorization: Bearer [YOUR_ACCESS_TOKEN]
Accept: application/json

返回:
{
  "kind": "youtube#playlistItemListResponse",
  "etag": "sKFBg0QAFkDAaRtysTrebMkkcN8",
  "nextPageToken": "CDIQAA",
  "items": [
    {
      "kind": "youtube#playlistItem",
      "etag": "n0z9esMo-NzLrFpY_pRAVr9dd7w",
      "id": "VVVfeDVYRzFPVjJQNnVaWjVGU005VHR3LlYtUXRjd0txOUpr",
      "snippet": {
        "publishedAt": "2021-05-13T20:17:27Z",
        "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
        "title": "Google I/O 2021, Android Studio 4.2, Google Play update, and more!",
        "description": "TL;DR 246 | The Google Developer News Show\n \n0:00 - Google I/O 2021 → https://goo.gle/3tKActE \n0:37 - Android Studio 4.2 → https://goo.gle/3hjinPQ  \n1:14 - New safety section in Google Play → https://goo.gle/3eH5rBB  \n1:46 - New Dashboard in Google Developer Profiles → https://goo.gle/33DWeDB  \n2:16 - Please remember to like, subscribe, and share! \n\nHere to bring you the latest developer news from across Google is Developer Advocate Meghan Metha. Tune in every week for a new episode, and let us know what you think of the latest announcements in the comments below! 😃\n\nFollow Google Developers on Instagram → https://goo.gle/googledevs             \n\nWatch more #DevShow → https://goo.gle/GDevShow               \nSubscribe to Google Developers → https://goo.gle/developers \n\n#Google #Developers",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/default.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/mqdefault.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/hqdefault.jpg",
            "width": 480,
            "height": 360
          },
          "standard": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/sddefault.jpg",
            "width": 640,
            "height": 480
          },
          "maxres": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/maxresdefault.jpg",
            "width": 1280,
            "height": 720
          }
        },
        "channelTitle": "Google Developers",
        "playlistId": "UU_x5XG1OV2P6uZZ5FSM9Ttw",
        "position": 0,
        "resourceId": {
          "kind": "youtube#video",
          "videoId": "V-QtcwKq9Jk"
        },
        "videoOwnerChannelTitle": "Google Developers",
        "videoOwnerChannelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw"
      },
      "contentDetails": {
        "videoId": "V-QtcwKq9Jk",
        "videoPublishedAt": "2021-05-13T21:00:21Z"
      },
      "status": {
        "privacyStatus": "public"
      }
    }
  ],
  "pageInfo": {
    "totalResults": 5340,
    "resultsPerPage": 50
  }
}

根据视频ID获取视频信息

请求:
GET https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id=Ks-_Mh1QhMc%2CV-QtcwKq9Jk&key=[YOUR_API_KEY] HTTP/1.1

Authorization: Bearer [YOUR_ACCESS_TOKEN]
Accept: application/json

id字段可以传以逗号分隔的多个id,该id是从上面的一个请求的返回的,contentDetails下的VideoId

返回:
{
  "kind": "youtube#videoListResponse",
  "etag": "zWPULojPN0SgmjLS7RzRh6217I4",
  "items": [
    {
      "kind": "youtube#video",
      "etag": "H0Be3-hhwR0AH_bFMPSsvwMkFhg",
      "id": "Ks-_Mh1QhMc",
      "snippet": {
        "publishedAt": "2012-10-01T15:27:35Z",
        "channelId": "UCAuUUnT6oDeKwE6v1NGQxug",
        "title": "Your body language may shape who you are | Amy Cuddy",
        "description": "Body language affects how others see us, but it may also change how we see ourselves. Social psychologist Amy Cuddy argues that \"power posing\" -- standing in a posture of confidence, even when we don't feel confident -- can boost feelings of confidence, and might have an impact on our chances for success. (Note: Some of the findings presented in this talk have been referenced in an ongoing debate among social scientists about robustness and reproducibility. Read Amy Cuddy's response here: http://ideas.ted.com/inside-the-debate-about-power-posing-a-q-a-with-amy-cuddy/)\n\nGet TED Talks recommended just for you! Learn more at https://www.ted.com/signup.\n\nThe TED Talks channel features the best talks and performances from the TED Conference, where the world's leading thinkers and doers give the talk of their lives in 18 minutes (or less). Look for talks on Technology, Entertainment and Design -- plus science, business, global issues, the arts and more.\n\nFollow TED on Twitter: http://www.twitter.com/TEDTalks\nLike TED on Facebook: https://www.facebook.com/TED\n\nSubscribe to our channel: https://www.youtube.com/TED",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/default.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/mqdefault.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/hqdefault.jpg",
            "width": 480,
            "height": 360
          },
          "standard": {
            "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/sddefault.jpg",
            "width": 640,
            "height": 480
          },
          "maxres": {
            "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/maxresdefault.jpg",
            "width": 1280,
            "height": 720
          }
        },
        "channelTitle": "TED",
        "tags": [
          "Amy Cuddy",
          "TED",
          "TEDTalk",
          "TEDTalks",
          "TED Talk",
          "TED Talks",
          "TEDGlobal",
          "brain",
          "business",
          "psychology",
          "self",
          "success"
        ],
        "categoryId": "22",
        "liveBroadcastContent": "none",
        "defaultLanguage": "en",
        "localized": {
          "title": "Your body language may shape who you are | Amy Cuddy",
          "description": "Body language affects how others see us, but it may also change how we see ourselves. Social psychologist Amy Cuddy argues that \"power posing\" -- standing in a posture of confidence, even when we don't feel confident -- can boost feelings of confidence, and might have an impact on our chances for success. (Note: Some of the findings presented in this talk have been referenced in an ongoing debate among social scientists about robustness and reproducibility. Read Amy Cuddy's response here: http://ideas.ted.com/inside-the-debate-about-power-posing-a-q-a-with-amy-cuddy/)\n\nGet TED Talks recommended just for you! Learn more at https://www.ted.com/signup.\n\nThe TED Talks channel features the best talks and performances from the TED Conference, where the world's leading thinkers and doers give the talk of their lives in 18 minutes (or less). Look for talks on Technology, Entertainment and Design -- plus science, business, global issues, the arts and more.\n\nFollow TED on Twitter: http://www.twitter.com/TEDTalks\nLike TED on Facebook: https://www.facebook.com/TED\n\nSubscribe to our channel: https://www.youtube.com/TED"
        },
        "defaultAudioLanguage": "en"
      },
      "contentDetails": {
        "duration": "PT21M3S",
        "dimension": "2d",
        "definition": "hd",
        "caption": "true",
        "licensedContent": true,
        "contentRating": {},
        "projection": "rectangular"
      },
      "statistics": {
        "viewCount": "19630769",
        "likeCount": "293174",
        "dislikeCount": "5600",
        "favoriteCount": "0",
        "commentCount": "8671"
      }
    },
    {
      "kind": "youtube#video",
      "etag": "eLxJnVkjRvCXeqs4kfxlWfT5iSQ",
      "id": "V-QtcwKq9Jk",
      "snippet": {
        "publishedAt": "2021-05-13T21:00:21Z",
        "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
        "title": "Google I/O 2021, Android Studio 4.2, Google Play update, and more!",
        "description": "TL;DR 246 | The Google Developer News Show\n \n0:00 - Google I/O 2021 → https://goo.gle/3tKActE \n0:37 - Android Studio 4.2 → https://goo.gle/3hjinPQ  \n1:14 - New safety section in Google Play → https://goo.gle/3eH5rBB  \n1:46 - New Dashboard in Google Developer Profiles → https://goo.gle/33DWeDB  \n2:16 - Please remember to like, subscribe, and share! \n\nHere to bring you the latest developer news from across Google is Developer Advocate Meghan Metha. Tune in every week for a new episode, and let us know what you think of the latest announcements in the comments below! 😃\n\nFollow Google Developers on Instagram → https://goo.gle/googledevs             \n\nWatch more #DevShow → https://goo.gle/GDevShow               \nSubscribe to Google Developers → https://goo.gle/developers \n\n#Google #Developers",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/default.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/mqdefault.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/hqdefault.jpg",
            "width": 480,
            "height": 360
          },
          "standard": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/sddefault.jpg",
            "width": 640,
            "height": 480
          },
          "maxres": {
            "url": "https://i.ytimg.com/vi/V-QtcwKq9Jk/maxresdefault.jpg",
            "width": 1280,
            "height": 720
          }
        },
        "channelTitle": "Google Developers",
        "tags": [
          "GDS: Yes",
          "google i/o",
          "google i/o 2021",
          "google i/o 21",
          "android studio 4.2",
          "google play",
          "google play update",
          "google play safety section",
          "google developer profiles",
          "google developer profiles dashboard",
          "android",
          "android developers",
          "google developer show",
          "the google developer show",
          "the developer show",
          "dev show",
          "dev news",
          "tl;dr",
          "developer news",
          "news",
          "updates",
          "ds",
          "google developers",
          "google news",
          "developers",
          "developer",
          "google latest",
          "google",
          "Meghan Metha"
        ],
        "categoryId": "28",
        "liveBroadcastContent": "none",
        "defaultLanguage": "en",
        "localized": {
          "title": "Google I/O 2021, Android Studio 4.2, Google Play update, and more!",
          "description": "TL;DR 246 | The Google Developer News Show\n \n0:00 - Google I/O 2021 → https://goo.gle/3tKActE \n0:37 - Android Studio 4.2 → https://goo.gle/3hjinPQ  \n1:14 - New safety section in Google Play → https://goo.gle/3eH5rBB  \n1:46 - New Dashboard in Google Developer Profiles → https://goo.gle/33DWeDB  \n2:16 - Please remember to like, subscribe, and share! \n\nHere to bring you the latest developer news from across Google is Developer Advocate Meghan Metha. Tune in every week for a new episode, and let us know what you think of the latest announcements in the comments below! 😃\n\nFollow Google Developers on Instagram → https://goo.gle/googledevs             \n\nWatch more #DevShow → https://goo.gle/GDevShow               \nSubscribe to Google Developers → https://goo.gle/developers \n\n#Google #Developers"
        },
        "defaultAudioLanguage": "en-US"
      },
      "contentDetails": {
        "duration": "PT2M33S",
        "dimension": "2d",
        "definition": "hd",
        "caption": "true",
        "licensedContent": false,
        "contentRating": {},
        "projection": "rectangular"
      },
      "statistics": {
        "viewCount": "6744",
        "likeCount": "301",
        "dislikeCount": "8",
        "favoriteCount": "0",
        "commentCount": "10"
      }
    }
  ],
  "pageInfo": {
    "totalResults": 2,
    "resultsPerPage": 2
  }
}

 

CentOS安装Samba和mac、win10连接

安装samba
yum -y install samba

关防火墙:
systemctl stop firewalld.service

关SELinux
setenforce 0
查看Selinux
getenforce
返回的结果分为三种:Enforcing,Permissive和Disabled。其中,Enforcing-代表记录警告且阻止可疑行为;Permissive-代表仅记录安全警告但不阻止可疑行为;Disabled表示被禁用。

如果不关的话,会导致能登录,但无法访问的情况。

修改smb.conf,增加下面的节点

[share]
        path = /data/share/office
        comment = xxxxx
        public = yes
        writable = yes
        browseable = yes
        guest ok = no
        valid users = office,ben
        available = yes

增加用户office
useradd office
useradd ben
这里不用为他们指定密码

设置samba的密码
smbpasswd -a office
smbpasswd -a ben
必须要先加用户,不然会出现:Failed to add entry for user xxxxx. 的错误

设置目录的权限:
chown office:office /data/share/office

同一时间,只能以一个用户连接上smb服务器,如果需要切换用户,需要先断开,在windows下,可以用net use断开:
net use \\1.1.1.1\xxx /del

 

Redisearch使用笔记

通过docker安装:
docker run -p 6380:6379 redislabs/redisearch:latest

127.0.0.1:6379> FT.CREATE myIdx ON HASH PREFIX 1 doc: SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT

127.0.0.1:6379>hset doc:1 title “hello world” body “lorem ipsum” url “http://redis.io”
127.0.0.1:6379>hset doc:2 title “hello coupon codes” body “lorem ipsum” url “http://redis.io”
127.0.0.1:6379>hset doc:3 title “hello promotions” body “lorem ipsum” url “http://redis.io”

默认情况下他会处理单复数的问题

命令文档:https://oss.redislabs.com/redisearch/Commands/

搜索词的语法:https://oss.redislabs.com/redisearch/Query_Syntax/

默认情况下多个以空格分隔的词是and判断,如果要是or的关系用|生成

Mac下连接L2TP后无法访问外网和ROUTE操作记录

Mac下查看路由规则:
netstat -r

Mac下查看dns:
scutil –dns

Route管理:
route -n add -net 221.5.203.0 -netmask 255.255.255.0 10.1.0.1
route -n delete -net 221.5.203.0 -netmask 255.255.255.0 10.1.0.1

无法访问外网的问题找了一下,是因为telnet dns 服务器53端口的时候响应特别的慢。

所以把vpn的dns设置成了家里的网关地址就行了。

PHP替换Emoji表情

在检测文本语言的时候,emoji表情会影响检测的准确性,从stackoverflow上找了一个函数,作一下记录:

function removeEmoji($text) {
    return trim(preg_replace('/([0-9|#][\x{20E3}])|[\x{00ae}|\x{00a9}|\x{203C}|\x{2047}|\x{2048}|\x{2049}|\x{3030}|\x{303D}|\x{2139}|\x{2122}|\x{3297}|\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{1F000}-\x{1FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F9FF}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F9FF}][\x{1F000}-\x{1FEFF}]?/u', '', $text));
}

 

CentOS安装多PHP环境

yum install epel-release
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll
systemctl enable php73-php-fpm
systemctl start php73-php-fpm

安装的配置文件路径:
/etc/opt/remi/php73/

安装路径:
/opt/remi/php83/root/usr/

启动fpm服务
systemctl restart php80-php-fpm

设置为自动运行
chkconfig php80-php-fpm on

CentOS升级curl
rpm -ivh http://www.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/city-fan.org-release-2-1.rhel7.noarch.rpm

yum update curl –enablerepo=city-fan.org -y

 

PHP里用SoapClient出现”Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL”处理

在一台很老的服务器上,调用bing的接口时,出现如下错误,以前都是好好的:

PHP Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://adinsight.api.bingads.microsoft.com/Api/Advertiser/AdInsight/v13/AdInsightService.svc?singleWsdl' : failed to load external entity "https://adinsight.api.bingads.microsoft.com/Api/Advertiser/AdInsight/v13/AdInsightService.svc?singleWsdl"

后面发现Curl也不行,报:Peer certificate cannot be authenticated with known CA certificates 错误。

wget也不行,也报:ERROR: cannot verify certificate。

现在看来是由于系统的根证书无效了(系统太老应该是很多年前的机器了),所以无法判断microsoft的证书的有效性,按如下操作就可以了:

cd /etc/pki/tls/certs
wget https://curl.haxx.se/ca/cacert.pem
cat cacert.pem >> ca-bundle.crt

思路是去下载一个新的可信证书串(上面是curl的,也可以找一个其它的),把这个串放到系统的可信证书后面去。

如果是在php程序里用curl的话,不用设置操作系统的,可以试试把 https://curl.haxx.se/ca/cacert.pem 下载下来后,再设置php.ini的curl设置

[curl]
curl.cainfo=/path/to/downloaded/cacert.pem