Laravel 框架 MySQL 运行报错: PDOStatement::execute (): MySQL server has gone away?

项目什么都没动,突然发现无法连远程的数据库了,只能连本地的,折腾了半天,连本地的都连不上了,简直像遇到了奇异事件。

用java程序连了一下,默认连不上,需要把usessl设为false,但是php对应的sslmode设为disable并不起作用。

尝试修改wait_timeout和connect_timeout也都无效,只是让等待的时间更长了。

直到在老同事刘明的提醒下,去查看laravel的日志,发现了这么一句:Unexpected server respose while doing caching_sha2 auth

于是,按这个问题去搜索,找到了https://www.cnblogs.com/qichao123/p/9719470.html

进到mysql,通过SELECT user,host,plugin FROM mysql.user;

确认我用的当前用户没问题,是mysql_native_password,于是继续配置my.cnf中的mysqld,添加:

default_authentication_plugin=mysql_native_password

回来测试成功。

部署自己的ngrok1.7服务

非常感谢https://hteen.cn/docker/docker-ngrok.html

我的服务器是ubuntu,首先登录服务器,依次运行以下命令:

docker pull hteen/ngrok
mkdir /root/ngrok
docker run --rm -it -e DOMAIN='tunnel.yourdomain.cn' -v /root/ngrok:/myfiles hteen/ngrok /bin/sh /build.sh
docker run -idt --name ngrok-server -v /root/ngrok:/myfiles -p 8082:80 -p 4432:443 -p 4443:4443  -e DOMAIN='tunnel.yourdomain.cn' hteen/ngrok /bin/sh /server.sh

运行结果显示一个token
这样,在服务器的/root/ngrok目录下则有
bin/ngrokd 服务端
bin/ngrok linux客户端
bin/darwin_amd64/ngrok osx客户端
bin/windows_amd64/ngrok.exe windows客户端
还要增加一个nginx的站点配置,转发请求


server {
listen 80;
server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://serverlocalip:8082;
}
}
server {
listen 443;
server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://serverlocalip:4432;
}
}

在本地电脑执行命令,下载对应的客户端,我的是mac,所以:
scp -i meixi.pem root@yourip:/root/ngrok/bin/darwin_amd64/ngrok ~/ngrok
然后在本地创建ngrok.yml文件,并填入以下内容:


server_addr: "tunnel.yourdomain.cn:4443"
trust_host_root_certs:false
tunnels:
weixin:
proto:
http:8080
subdomain:"wx"
api:
proto:
http:80
subdomain:"api"

然后在本地执行
~/ngrok –config=ngrok.yml start weixin api
就启动了。

使用iview的upload组件上传阿里oss的参数设置

下面是组件设置:

<Upload action="http://public.files.dpexpo.cn"
ref="upload"
:show-upload-list="false"
accept=".pdf"
:format="['pdf']"
:on-success="uploadSuccess"
:data="uploadParams"
:max-size="102400"
:before-upload="handleBeforeUpload">
<Buttontype="ghost"
icon="ios-cloud-upload-outline">Upload pdf</Button>
</Upload>
以下是相关的js方法:

handleBeforeUpload(file) {
letthat=this;
return new Promise(function(resolve, reject) {
that.getUploadParams().then(function() {
that.$Notice.warning({
title:'文件准备上传',
desc:'文件 '+file.name+' 准备上传。',
duration:3
});
resolve();
});
});
},
getUploadParams() {
varthat=this;
return new Promise(function(resolve, reject) {
that.$http// 在此方法中调用后台数据
.get('/ossParams', {
params: {
dir:
'slide/conference/'+
that.$route.query.conference_id+
'/'
}
})
.then(function(response) {
console.log(response);
that.uploadParams=JSON.parse(response.data.data);
console.log(that.uploadParams);
resolve();
})
.catch(function(error) {
console.log(error);
});
});
},
uploadSuccess(evnet, file) {
console.log(file);
this.$Notice.success({
title:'文件上传成功',
desc:'文件 '+file.name+' 上传成功。',
duration:3
});
this.formValidate.slide_url=
'http://public.files.dpexpo.cn/slide/conference/'+
this.$route.query.conference_id+
'/'+
file.name;
},

以下是发放参数的api方法(laravel):

public function ossParams(Request $request)
{
$id = 'LTA(your id)V1E';
$key = '4M5nIHs(your key)IelsW';
$host = 'http://public.files.dpexpo.cn';
$now = time();
$expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
$end = $now + $expire;
$expiration = $this->gmt_iso8601($end);
$dir = $request->dir ? $request->dir : 'user-dir/';
//最大文件大小.用户可以自己设置
$condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
$conditions[] = $condition;
//表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
$start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
$conditions[] = $start;
$arr = array('expiration' => $expiration, 'conditions' => $conditions);
//echo json_encode($arr);
//return;
$policy = json_encode($arr);
$base64_policy = base64_encode($policy);
$string_to_sign = $base64_policy;
$signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));
$response = array();
//$response['host'] = $host;
$response['key'] = $dir.'${filename}';
$response['policy'] = $base64_policy;
$response['OSSAccessKeyId'] = $id;
$response['Signature'] = $signature;
$response['expire'] = $end;
//这个参数是设置用户上传指定的前缀
//$response['dir'] = $dir;
$token = json_encode($response);
return$this->response->array(['data' => $token]);
}

Visual Studio Code中使用Docker中的Xdebug

开发环境说明

IDE:Visual Studio Code

DNMP:https://github.com/yeszao/dnmp

项目:laravel

开启xdebug

修改dnmp/php/php72/Dockerfile,添加以下两行(插在带\的任一一行后面即可,查看dockerfile编写规范):

&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
修改dnmp/config/php.ini,在文件末尾添加以下内容:
[xdebug]
zend_extension=xdebug.so
xdebug.remote_port=9000
xdebug.remote_enable=1
xdebug.remote_host=192.168.0.102
xdebug.remote_autostart=1
xdebug.remote_log="/var/log/dnmp/xdebug.log"

其中192.168.0.102就是你的电脑的IP,也就是docker宿主机的IP,docker的端口都挂到宿主机IP上。xdebug默认是localhost,不改就访问不到了。也不要打开

xdebug.remote_connect_back=1,这会使得remote_host配置失效。
在vscode中安装PHP Debug插件,在调试选项卡中打开齿轮配置,即当前项目的.vscode/launch.json,对照以下内容配置:

{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000,
"pathMappings":{
"/var/www/html": "${workspaceRoot}"
}
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9000
}
]
}
其中,/var/www/html是你在dnmp/www中的site的位置,如果有子目录则填到子目录级别,这里的pathMappings是最新的写法。
在dnmp目录启动:docker-compose up
在vscode按F5启动调试,记得打上断点,祝你成功。
如果已经生成过容器,则需要删除容器,删除镜像。重新生成dnmp-php命令如下:
docker rm dnmp-php
docker rmi dnmp_php
docker-compose up

Error starting userland proxy: mkdir /port/tcp:0.0.0.0:3306:tcp:172.19.0.3:3306: input/output error

在windows10/win10上使用dnmp:https://www.awaimai.com/2120.html

首先需要安装docker环境:https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

装完以后在dnmp目录执行docker-compose up,启动失败,报错如标题,需要修改win10的快速启动设置,然后重启。修改方法见:https://www.tenforums.com/tutorials/4189-turn-off-fast-startup-windows-10-a.html

ECS之Ubuntu上使用docker部署Jenkins持续集成支持dnmp

第一步,创建容器:

docker run -u root -p 8080:8080 -p 50000:50000 -v /root/docker:/var/jenkins_home –name j02 -idt jenkins

解释:

  1. 注意这里以root用户启动,如果使用默认用户jenkins则不需要加-u,但是可能会造成与dnmp之间的文件读写权限有麻烦。
  2. 与宿主机的共享目录设置为/root/docker,这个随便,其实放哪里都行,放这里为了登录进去以后方便找。
  3. –name叫j02这个随便,是生成的docker的镜像名,开始那个叫j01,后来改root权限启动我改成了j02,无所谓。
  4. 端口绑定的是8080
执行命令docker logs -f j02查看容器的控制台日志,看到如下信息表示jenkins服务启动成功:
Dec 31, 2017 6:29:24 AM jenkins.install.SetupWizard init
INFO:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
f0f2e35d549f49b486b0ca2bdf3756d6
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
Dec 31, 2017 6:29:29 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Dec 31, 2017 6:29:30 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Dec 31, 2017 6:29:30 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Dec 31, 2017 6:29:30 AM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
–> setting agent port for jnlp
–> setting agent port for jnlp… done
Dec 31, 2017 6:29:33 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Dec 31, 2017 6:29:33 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 11,856 ms
1
2
3
打开浏览器查看IP:8080就见到jenkins的页面了,但需要输入上面那个日志中的initialAdminPassword才能开始。从上面日志复制,或者cat /root/docker/secrets/initialAdminPassword
点击左边按建议配置安装。
设置用户名密码。
参考文章:https://blog.csdn.net/boling_cavalry/article/details/78942408(它是为java弄的,如果只是php和node项目,不需要maven插件)
进入容器:
docker exec -it j02 /bin/bash
因为我们用的是root权限,而jenkins默认是jenkins用户,所以进来第一步创建ssh秘钥之前需要改一下.ssh目录的链接,使用:
ln -s /var/jenkins_home/.ssh /root/.ssh
执行以下命令产生SSH证书:
ssh-keygen -t rsa -C “abcdef@gmail.com”
会出现几个询问,直接按回车键继续。
执行以下命令配置全局用户信息的账号:
git config –global user.name”abcdef”
1
执行以下命令配置全局用户信息的邮箱:
git config –global user.email abcdef@gmail.com
1
公钥被存储到以下位置,打开复制所有内容,然后登录git,添加到SSH keys中:
/var/jenkins_home/.ssh/id_rsa.pub,也就是宿主机的/root/docker/.ssh/id_rsa.pub。
执行exit,退出容器,以下命令查看。
cat /root/docker/.ssh/id_rsa
将其贴到github账户的setting中。
打开jenkins页面,新建项目,构建一个自由风格的项目。
源码管理选择git,输入源的地址:git@github.com:bianjibang/dp-api.git
Credentials那里点add,添加provider,选择ssh username with private key,然后private key来自第三个选项From the Jenkins master ~/.ssh。
就添加成功了。
回到项目设置页面在Credentials那里点刷新就看到新增的授权了,选择的时候可能需要点两次才能选上。
构建触发器那里选GitHub hook trigger for GITScm polling,即当github收到posh的时候自动拉取。
构建那里选择execute shell,可以放入想要在完成时执行的后续命令。比如
cp -r $WORKSPACE/* $JENKINS_HOME/dnmp/www/dp/api
点击立即构建,可以看到新增的build history,点击某个history, 进入Console Output可以看到执行日志,通过其内容可以修正命令。
接下来,在宿主机/root/docker下面
git clone git@github.com:yeszao/dnmp.git(建议首先fork到自己账户下,clone自己的,这样以后修改配置比较方便)

2015年最新Godaddy之Windows主机设置文件写入权限方法

新版的后台一直没搞清楚文件权限在哪里设置,实在忍不住了,在FileManager中,选择一个文件夹,点菜单里的Privacy,然后取消勾选Inherit,这样就可以勾选Web writable了,最后再勾选上Set all subfolders to inherit permissions,让下级目录继承这个写入权限。


后来发现又更新了,现在是在每个文件夹名后面的下拉箭头里面设置权限。2016年11月8日记