PHP使用curl

php封装好的5种不同方式的curl请求函数

<?php
//get请求
function geturl($url){
        $headerArray =array("Content-type:application/json;","Accept:application/json");
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output,true);
        return $output;
}

//post请求
function posturl($url,$data){
        $data  = json_encode($data);    
        $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return json_decode($output,true);
}


//put请求
function puturl($url,$data){
    $data = json_encode($data);
    $ch = curl_init(); //初始化CURL句柄 
    curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串
    $output = curl_exec($ch);
    curl_close($ch);
    return json_decode($output,true);
}

//del请求
function delurl($url,$data){
    $data  = json_encode($data);
    $ch = curl_init();
    curl_setopt ($ch,CURLOPT_URL,$put_url);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");   
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output,true);
}

//patch请求
function patchurl($url,$data){
    $data  = json_encode($data);
    $ch = curl_init();
    curl_setopt ($ch,CURLOPT_URL,$url);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");  
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);     
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output);
    return $output;
}
?>

CentOS7 手动部署lnmp环境

步骤一:准备编译环境

  1. 关闭防火墙。
    1. 运行systemctl status firewalld命令,查看当前防火墙的状态。查看防火墙状态
      • 如果防火墙的状态参数是inactive,则防火墙为关闭状态。
      • 如果防火墙的状态参数是active,则防火墙为开启状态。
    2. 关闭防火墙。如果防火墙为关闭状态可以忽略此步骤。
      • 如果您想临时关闭防火墙,需要运行以下命令:systemctl stop firewalld说明 临时关闭防火墙后,如果Linux实例重启,则防火墙将会自动开启。
      • 如果您想永久关闭防火墙,需要依次运行以下命令:
        1. 关闭防火墙。systemctl stop firewalld
        2. 实例开机时,禁止启动防火墙服务。systemctl disable firewalld
  2. 关闭SELinux。
    1. 运行getenforce命令查看SELinux的当前状态。
      • 如果SELinux状态参数是Disabled,则SELinux为关闭状态。
      • 如果SELinux状态参数是Enforcing,则SELinux为开启状态。
    2. 关闭SELinux。如果SELinux为关闭状态可以忽略此步骤。

步骤二:安装Nginx

  1. 运行以下命令安装Nginx。yum -y install nginx
  2. 运行以下命令查看Nginx版本。nginx -v返回结果如下所示,表示Nginx安装成功。nginx version: nginx/1.20.1

步骤三:安装MySQL

  1. 运行以下命令更新YUM源。rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
  2. 运行以下命令安装MySQL。说明 如果您使用的操作系统内核版本为el8,可能会提示报错信息No match for argument。您需要先运行命令yum module disable mysql禁用默认的MySQL模块,再安装MySQL。yum -y install mysql-community-server
  3. 运行以下命令查看MySQL版本号。mysql -V返回结果如下所示,表示MySQL安装成功。mysql Ver 14.14 Distrib 5.7.36, for Linux (x86_64) using EditLine wrapper
  4. 运行以下命令启动MySQL。systemctl start mysqld
  5. 依次运行以下命令设置开机启动MySQL。systemctl enable mysqldsystemctl daemon-reload

步骤四:安装PHP

  1. 更新YUM源。
    1. 运行以下命令添加epel源。yum install \https://repo.ius.io/ius-release-el7.rpm \https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    2. 运行以下命令添加Webtatic源。rpm -ivh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
  2. 运行以下命令安装PHP。yum -y install php71w-devel php71w.x86_64 php71w-cli.x86_64 php71w-common.x86_64 php71w-gd.x86_64 php71w-ldap.x86_64 php71w-mbstring.x86_64 php71w-mcrypt.x86_64 php71w-pdo.x86_64 php71w-mysqlnd php71w-fpm php71w-opcache php71w-pecl-redis php71w-pecl-mongodb
  3. 运行以下命令查看PHP版本。php -v返回结果如下所示,表示安装成功。PHP 7.0.33 (cli) (built: Dec 6 2018 22:30:44) ( NTS )Copyright (c) 1997-2017 The PHP GroupZend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.33, Copyright (c) 1999-2017, by Zend Technologies

步骤五:配置Nginx

  1. 运行以下命令备份Nginx配置文件。cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
  2. 修改Nginx配置文件,添加Nginx对PHP的支持。说明 若不添加此配置信息,后续您使用浏览器访问PHP页面时,页面将无法显示。
    1. 运行以下命令打开Nginx配置文件。vim /etc/nginx/nginx.conf
    2. 按i进入编辑模式。
    3. server大括号内,修改或添加下列配置信息。除下面提及的需要添加或修改的配置信息外,其他配置保持默认值即可。
      • 添加或修改location /配置信息。 location / { index index.php index.html index.htm; }
      • 添加或修改location ~ .php$配置信息。 #添加下列信息,配置Nginx通过fastcgi方式处理您的PHP请求。 location ~ .php$ { root /usr/share/nginx/html; #将/usr/share/nginx/html替换为您的网站根目录,本文使用/usr/share/nginx/html作为网站根目录。 fastcgi_pass 127.0.0.1:9000; #Nginx通过本机的9000端口将PHP请求转发给PHP-FPM进行处理。 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; #Nginx调用fastcgi接口处理PHP请求。 }
      添加或修改配置信息后,文件内容如下图所示:nginx配置文件
    4. 按下Esc键后,输入:wq并回车以保存关闭配置文件。
  3. 运行以下命令启动Nginx服务。systemctl start nginx
  4. 运行以下命令设置Nginx服务开机自启动。systemctl enable nginx

步骤六:配置MySQL

  1. 运行以下命令查看/var/log/mysqld.log文件,获取并记录root用户的初始密码。grep 'temporary password' /var/log/mysqld.log命令行返回结果如下,其中ARQTRy3+n8*W为MySQL的初始密码。在下一步重置root用户密码时,会使用该初始密码。2021-11-10T07:01:26.595215Z 1 [Note] A temporary password is generated for root@localhost: ARQTRy3+n8*W
  2. 运行以下命令配置MySQL的安全性。mysql_secure_installation
    1. 输入MySQL的初始密码。说明 在输入密码时,系统为了最大限度的保证数据安全,命令行将不做任何回显。您只需要输入正确的密码信息,然后按Enter键即可。Securing the MySQL server deployment. Enter password for user root: #输入上一步获取的root用户初始密码
    2. 为MySQL设置新密码。The existing password for the user account root has expired. Please set a new password. New password: #输入新密码。长度为8至30个字符,必须同时包含大小写英文字母、数字和特殊符号。特殊符号包含()` ~!@#$%^&*-+=|{}[]:;‘<>,.?/ Re-enter new password: #确认新密码。The 'validate_password' plugin is installed on the server.The subsequent steps will run with the existing configurationof the plugin.Using existing password for root. Estimated strength of the password: 100 #返回结果包含您设置的密码强度。Change the password for root ? ((Press y|Y for Yes, any other key for No) :Y #您需要输入Y以确认使用新密码。 #新密码设置完成后,需要再次验证新密码。New password:#再次输入新密码。 Re-enter new password:#再次确认新密码。 Estimated strength of the password: 100Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) :Y #您需要输入Y,再次确认使用新密码。
    3. 输入Y删除匿名用户。Remove anonymous users? (Press y|Y for Yes, any other key for No) :YSuccess.
    4. 输入Y禁止使用root用户远程登录MySQL。Disallow root login remotely? (Press y|Y for Yes, any other key for No) :YSuccess.
    5. 输入Y删除test库以及用户对test库的访问权限。Remove test database and access to it? (Press y|Y for Yes, any other key for No) :Y - Dropping test database...Success. - Removing privileges on test database...Success.
    6. 输入Y重新加载授权表。Reload privilege tables now? (Press y|Y for Yes, any other key for No) :YSuccess. All done!

步骤七:配置PHP

  1. 新建并编辑phpinfo.php文件,用于展示PHP信息。
    1. 运行以下命令新建phpinfo.php文件。vim <网站根目录>/phpinfo.php<网站根目录>是您在nginx.conf配置文件中location ~ .php$大括号内,配置的root参数值,如下图所示。网站根目录本文配置的网站根目录为/usr/share/nginx/html,因此需要运行以下命令新建phpinfo.php文件:vim /usr/share/nginx/html/phpinfo.php
    2. 按i进入编辑模式。
    3. 输入下列内容,函数phpinfo()​会展示PHP的所有配置信息。<?php echo phpinfo(); ?>
    4. 按Esc键后,输入:wq并回车,保存关闭配置文件。
  2. 运行以下命令启动PHP-FPM。systemctl start php-fpm
  3. 运行以下命令设置PHP-FPM开机自启动。systemctl enable php-fpm

步骤八:测试访问LNMP配置信息页面

  1. 在本地Windows主机或其他具有公网访问能力的Windows主机中,打开浏览器。
  2. 在浏览器的地址栏输入http://<ECS实例公网IP地址>/phpinfo.php进行访问。访问结果如下图所示,表示LNMP环境部署成功。php结果

后续步骤

测试访问LNMP配置信息页面后,建议您运行以下命令将phpinfo.php文件删除,消除数据泄露风险。

rm -rf <网站根目录>/phpinfo.php

其中,<网站根目录>需要替换为您在nginx.conf中配置的网站根目录。本文配置的网站根目录为/usr/share/nginx/html,因此需要运行以下命令:

rm -rf /usr/share/nginx/html/phpinfo.php

常见问题

如何使用其他版本的Nginx服务器?

  1. 使用浏览器访问Nginx开源社区获取对应的Nginx版本的下载链接。请根据您的个人需求,选择对应的Nginx版本。本章节以Nginx 1.8.1为例。
  2. 远程连接需要部署LNMP环境的ECS实例。
  3. 运行wget命令下载Nginx 1.8.1。您可以通过Nginx开源社区直接获取对应版本的安装包URL,然后通过wget URL的方式将Nginx安装包下载至ECS实例。例如,Nginx 1.8.1的下载命令如下:wget http://nginx.org/download/nginx-1.8.1.tar.gz
  4. 运行以下命令,安装Nginx相关依赖。yum install -y gcc-c++yum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel
  5. 运行以下命令,解压Nginx 1.8.1安装包,然后进入Nginx所在的文件夹。tar zxvf nginx-1.8.1.tar.gzcd nginx-1.8.1
  6. 依次运行以下命令,编译源码。./configure \ --user=nobody \ --group=nobody \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_realip_module \ --with-http_sub_module \ --with-http_ssl_modulemake && make install
  7. 运行以下命令,进入Nginx的sbin目录,然后启动Nginx。cd /usr/local/nginx/sbin/./nginx
  8. 在本地主机中,使用浏览器访问ECS实例公网IP。出现如下图所示的页面,表示Nginx已成功安装并启动。nginx

pip换源

  1. 临时使用:

在使用pip的时候加参数-i

例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent

常用的pip源如下:

pypi 清华大学源:https://pypi.tuna.tsinghua.edu.cn/simple
pypi 豆瓣源 :http://pypi.douban.com/simple/
pypi 腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
pypi 阿里源:https://mirrors.aliyun.com/pypi/

  1. 永久修改:

linux下 :

mkdir ~/.pip
vi ~/.pip/pip.conf

添加内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

vim查找与替换

 VIM中常用的替换模式总结。

1,简单替换表达式

替换命令可以在全文中用一个单词替换另一个单词:

:%s/four/4/g

“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可

  如果你有一个象 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4″。要解决这个问题,用 “\<” 来指定匹配单词开头:

       :%s/\<four/4/g

显然,这样在处理 “fourty” 的时候还是会出错。用 “\>” 来解决这个问题:

       :%s/\<four\>/4/g

如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:

       :%s/\<four\>/4/gc

2,删除多余的空格

要删除这些每行后面多余的空格,可以执行如下命令:

       :%s/\s\+$//

命令前面指明范围是 “%”,所以这会作用于整个文件。”substitute” 命令的匹配模式是

“\s\+$”。这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。

3,匹配重复性模式

星号项 “*” 规定在它前面的项可以重复任意次。因此:

       /a*

匹 配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*” 仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配 “a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 “\(“,后面加 “\)”。因此这个命令:

       /\(ab\)*

匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。

要避免匹配空字串,使用 “\+”。这表示前面一项可以被匹配一次或多次。

       /ab\+

匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。

要匹配一个可选项,用 “\=”。 例如:

       /folders\=

匹配 “folder” 和 “folders”。

4,指定重复次数

要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如:

       /ab\{3,5}

匹配 “abbb”,”abbbb” 以及 “abbbbb”。

  当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:

       模式 匹配次数

       \{,4} 0,1,2,3 或 4

       \{3,} 3,4,5,等等

       \{0,1} 0 或 1,同 \=

       \{0,} 0 或 更多,同 *

       \{1,} 1 或 更多,同 \+

       \{3} 3

5,多选一匹配

在一个查找模式中,”或” 运算符是 “\|”。例如:

       /foo\|bar

这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面:

       /one\|two\|three

匹配 “one”,”two” 或 “three”。

  如要匹配其多次重复,那么整个抉择结构须置于 “\(” 和 “\)” 之间:

       /\(foo\|bar\)\+

这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。

  再举个例子:

       /end\(if\|while\|for\)

这个命令匹配 “endif”,”endwhile” 和 “endfor”。

Centos 配置eth0 提示Device does not seem to be present

一.故障现象:[root@c1node01 ~]# service network restartShutting down loopback insterface:                                                       [   OK  ]Bringing up loopback insterface:                                                            [   OK  ]Bringing up interface eth0:  Device eth0 does not seem to be present,delaying initialization.                    [FAILED]解决办法:[root@c1node01 ~]# rm -rf /etc/udev/rules.d/70-persistent-net.rules[root@c1node01 ~]# reboot ………………[root@c1node01 ~]# service network restartShutting down loopback insterface:                                                         [   OK   ]Bringing up loopback insterface:                                                              [   OK   ]Bringing up interface eth0:                                                                     [   OK   ][root@c1node01 ~]# 二.另一种方法造成这样的原因,是因为在虚拟机(Vmware)中移动了Centos系统对应的文件,导致重新配置时,网卡的MAC地址变了,输入ifconfig -a,找不到eth0······· 安装完一个centos虚拟机,又拷贝一份,开机后网卡无法正常启动,报错:Device eth0 does not seem to be present, 
delaying initialization

解决:# mv /etc/sysconfig/network-scripts/ifcfg-eth0 
sysconfig/network-scripts/ifcfg-eth1

vim 
sysconfig/network-scripts/ifcfg-eth1

修改DEVICE=”eth0″ 
为DEVICE=”eth1″

然后重启启动网卡尝试下 三.比第一种更深入一点

故障前的操作:

DELL刀片装的是CentOS6.3的操作系统,网卡识别的是em1和em2,由于工作需要做了槽位调整,并启动了刀片

故障现象:

启动后网络不通,通过iDRAC登录后route查看缺省路由正常;

重启网络服务:

[root@nodeA ~]# service network restart Shutting down loopback insterface: [ OK ] Bringing up loopback insterface: [ OK ] Bringing up interface em1: Device em1 does not seem to be present,delaying initialization. [FAILED]

分析问题和解决:

之前在别的文章中我们提过70-persistent-net.rules文件,所以看了一下:

[root@nodeA ~]# vi /etc/udev/rules.d/70-persistent-net.rules

# This file was automatically generated by the /lib/udev/write_net_rules # program, run by the persistent-net-generator.rules rules file. # # You can modify it, as long as you keep each rule on a single # line, and change only the value of the NAME= key.

# PCI device 0x14e4:0x163a (bnx2) SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”24:b6:fd:ab:76:1e”, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth1″

# PCI device 0x14e4:0x163a (bnx2) SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”24:b6:fd:ab:76:1c”, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth0″

发现NAME的名称不正确,依次将上述红色字体中的eth0改为em1,eth1改为em2;

*切记:网卡编号由MAC地址大小决定,MAC越小网卡编号越小;

如下:

…………

# PCI device 0x14e4:0x163a (bnx2)

SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”24:b6:fd:ab:76:1e”, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”em2″

# PCI device 0x14e4:0x163a (bnx2) SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”24:b6:fd:ab:76:1c”, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”em1″

保存退出~!

[root@nodeA ~]#reboot

mac显示隐藏文件

1,显示方法:在“终端”输入命令defaults write com.apple.finder AppleShowAllFiles TRUEkillall Finder重启Finder,系统隐藏的文件都显示出来了。2,隐藏方法:在“终端”输入命令defaults write com.apple.finder AppleShowAllFiles FALSEkillall Finder即可。3,通过finder菜单中的“前往文件夹”输入路径,也可以直接访问隐藏的文件。4,如何隐藏自己的个人文件夹。同样:终端隐藏个人文件夹,输入 chflags hidden 文件路径取消隐藏:输入 chflags nohidden 文件路径

恢复excel内容

1.复制一份该文件,并将扩展名“xlsx”改成“zip”;2.打开此压缩文件,找到“xl”下的“sharedStrings.xml”并解压出来,保留此窗口;3. 用“记事本”将解压出来的文件“sharedStrings.xml”打开,使用查找替换功能将所有的“</r><si>”替换成“</r></si><si>”,并保存关闭;(不知道是否存在“</t><si>”等其它情况)4.将改好的文件拖回步骤2中的窗口,并确定关闭;5.将文件扩展名从“zip”改回“xlsx”即可。

从Git仓库中恢复已删除的分支、文件或丢失的commit

在使用Git的过程中,有时可能会有一些误操作比如:执行checkout -f 或 reset -hard 或 branch -d删除一个分支结果造成本地(远程)的分支或某些commit丢失可以通过reflog来进行恢复,前提是丢失的分支或commit信息没有被git gc清除
一般情况下,gc对那些无用的object会保留很长时间后才清除的reflog是git提供的一个内部工具,用于记录对git仓库进行的各种操作可以使用git reflog show或git log -g命令来看到所有的操作日志
恢复的过程很简单:
1. 通过git log -g命令来找到我们需要恢复的信息对应的commit_id,可以通过提交的时间和日期来辨别。一个好的办法是运行:1、git log –since=”2 weeks ago” — myfile 可以2个星期期间的myfile历史;2、git log –branches=”develop” 可以查看develop的commit
2. 通过git branch recover_branch[新分支] commit_id 来建立一个新的分支这样,我们就把丢失的东西给恢复到了recover_branch分支上了。
Q:如果是不小心执行了git reset,还有办法取消吗?A:git reflog 查看操作历史,找到之前 HEAD 的 hash 值,然后 git reset –hard 到那个 hash 即可。
Q:怎样找回历史版本中删除的文件?A:先确定需要恢复的文件要恢复成哪一个历史版本(commit),假设那个版本号是: commit_id,那么git checkout [commit_id] — <path_to_file>就可以恢复。