获取本机公网IP地址接口

自从新浪通用接口

http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255

凉了之后,要找个靠谱的接口非常重要,下面提供一个免费的接口,这个接口是由www.pubyun.com提供的,老牌DDNS服务商(原名:希网 3322)公云

http://members.3322.org/dyndns/getip

phpStudy更新MySQL

博主这两天在windows上开发,需要MySQL5.7版本。

phpStudy内置的是MySQL5.5,又不想使用原生MySQL安装包或者Docker

于是乎,把phpStudy内置的MySQL升级一下

到官网上下载自己所需的MySQL压缩包,不是exe,msi安装包那种

64位系统尽量下载 64-bit的,更高效率

先用phpStudy管理器把MySQL给停了

以管理员权限打开cmd,运行sc delete MySQLa 删除当前的MySQL服务

重命名一下自带的MySQL文件夹为 MySQL5.5

把下载MySQL包解压放到当前目录的MySQL文件夹中

新建data文件夹和my.ini文件

my.ini文件内容参考如下:

[client]
port=3306
[mysql]
default-character-set=utf8

[mysqld]
port=3306
skip-grant-tables
basedir="D:/development/phpStudy/PHPTutorial/MySQL/"
datadir="D:/development/phpStudy/PHPTutorial/MySQL/data/"
character-set-server=utf8
default-storage-engine=INNODB

保存好了之后,注册系统服务

以管理员身份打开cmd,进入到这个目录

输入 mysqld –initialize 初始化data内的数据,其中包含了mysql这个数据库的初始数据

输入 mysqld install MySQLa回车,这样子就注册好MySQL服务(phpStudy注册的服务名称就是MySQLa)

打开phpStudy管理器,就能操作MySQL的启动、停止了

输入命令mysql -uroot -p回车后提示输入密码继续回车,因为没有密码。

输入use mysql;update user set authentication_string=password('你要的密码') where user='root'; flush privileges;

这样子设置好root密码了

参考资料:

http://phpstudy.php.cn/jishu-php-2967.html

https://blog.csdn.net/qq_37540398/article/details/81510488

一种PHP的nginx伪静态写法

众所周知,thinkphp5的Nginx写法是这样子的:

location / {
   if (!-e $request_filename) {
      rewrite  ^(.*)$  /index.php?s=/$1  last;
   }
}

现在网站根目录下面有一个admin.php文件

请求http://abc.com/admin.php/login时候,请求会被nginx转发到index.php

按照开发需求,则需要转发至admin.php

nginx单host完整配置代码如下

server {
     listen 80;
     server_name abc.com;
     root /xxxx/xxxx;
     index index.html index.htm index.php;
     charset utf-8;
	location ~ [^/]\.php(/|$)
	{
		try_files $uri =404;
		fastcgi_pass  127.0.0.1:9000;
		fastcgi_index index.php;
		include fastcgi.conf;
		set $real_script_name $fastcgi_script_name;
		if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
			set $real_script_name $1;
			set $path_info $2;
		}
		fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
		fastcgi_param SCRIPT_NAME $real_script_name;
		fastcgi_param PATH_INFO $path_info;
	}

	location / {
		if (!-e $request_filename) {
			rewrite  ^/(.*)$  /index.php?s=/$1 last;
			break;
		}
	}
}

如何让laravel永远返回json串,包含报错内容

在使用laravel做API服务端的时候,想让laravel永远返回json串,方便App端或者ajax查看调试信息.

思路:让Illuminate/Http/Request类的expectsJson、wantsJson这两个方法永远返回true

这个Request类是composer提供的,我们不能直接修改,先extends这个类,然后我们覆盖这两个方法。

<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;

class BaseRequest extends Request {

public function wantsJson() {return true;}

public function expectsJson() {return true;}

}

在框架的index.php修改一下 注入的Request类

$response = $kernel->handle(
    $request = \App\Http\Requests\BaseRequest::capture()
);

之后,laravel返回的默认类型都是json了,包括了错误日志

参考:https://laravel-china.org/wikis/16069

跨域问题,当mode为include时,Access-Control-Allow-Origin不能为*,

The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.


配合前端写Vue项目时,浏览器遇到这种错误,按道理来说http response 的 header 中 Access-Control-Allow-Origin参数 为* 时,可以满足一切域名情况。

看样子 看了半天也不行,修改nginx的配置 Access-Control-Allow-Origin 改为 http://xxx.xxx.com时候,可以了。最后查找跨域文档才发现

跨域请求发送cookie的时候,需要判断是否包含了请求源的origin,不然不发送cookie,然后,OPTIONS请求发送成功后,并没有新的请求发出。

解决方法是:
nginx配置修改一下

add_header Access-Control-Allow-Origin *;

改成

add_header Access-Control-Allow-Origin "$http_origin";


这样满足任何情况

composer版本符号

* : 最新版 


>=1.0: 大于等于1.0的最高版本 


>=1.0 <2.0:大于等于1.0且小于2.0的最高版本


1.0 – 2.0:1.0至2.0之间的最高版本 


1.0.*:>=1.0且<1.1的最高版本 


~1.2:>=1.2且<2.0的最高版本 


~1.2.3:>=1.2.3且<1.3.0最高版本 


^1.2.3:>=1.2.3且<2.0.0的最高版本

https://blog.csdn.net/hwhsong/article/details/79079197

PHP curl模拟form表单上传文件

关键代码如下:

$ch = curl_init('https://www.baidu.com/uploadImage');
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => new \CURLFile($fileRealPath)]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);

备忘

PHP脚本实现webhook源码

error_reporting(1);
set_time_limit(0);
// 部署目录
$target = '/www/www.baidu.com';
// 部署密钥
$token = '123456789';
// 部署分支
$branch = 'develop';

// token判断
$request_token = isset($_SERVER['HTTP_X_GITLAB_TOKEN']) ? $_SERVER['HTTP_X_GITLAB_TOKEN'] : '';
if ($token !== $request_token) {
die;
}

// 分支判断
$arr = file_get_contents('php://input', 'r');
$arr = json_decode($arr, true);
if (JSON_ERROR_NONE !== json_last_error()) {
die;
}
$ref = isset($arr['ref']) ? $arr['ref'] : die;
$ref = explode('/', $ref);
$ref = array_pop($ref);
if ($branch != $ref) {
die;
}

$cmd = "(cd $target && git pull && composer install -vvv) > /dev/null 2>&1 &";
echo shell_exec($cmd);

最容易理解的CSS的position教程——十步图解CSS的position

CSS的positon,我想做为一个Web制作者来说都有碰到过,但至于对其是否真正的了解呢?那我就不也说了,至少我自己并不非常的了解其内核的运行。今天在Learn CSS Positioning in Ten Steps一文中分十步介绍了CSS的“position”中的“static、relative、absolute、float”使用,觉得蛮有意思的。整理了一下贴上来与大家一起分享。希望大家能喜欢。

继续阅读“最容易理解的CSS的position教程——十步图解CSS的position”