手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表全部文章

还好没有手贱升级PHP7

本来想将当前的服务器升级到PHP7的,在临最后动手的一霎那,突然想起,sablog用的是mysql_*的函数,在PHP7已经彻底没有了。

感慨一下没有手贱啊。不然就死啦死啦的了。准备这两天将原来的mysql类改用PDO实现一下,然后本地跑一下,看看PHP7是不是可以运行。如果OK的话,准备升级!

mac 清理dns cache

 之所以提起这个功能,是因为在windows下面太方便了,进入cmd窗口:ipconfig /flushdns ,轻轻松松处理

在mac上面就没有这么方便了,很久前,用“dscacheutil -flushcache”就可以解决了。但自从升级后这些命令就没有了,你必须得用这个组合才能清理干净:
XML/HTML代码
  1. sudo dscacheutil -flushcache  
  2. sudo killall -HUP mDNSResponder  
这不是什么新命令。
 
为什么会再提起它?是因为我在家里dmz了我的mac mini,然后,路由器自动拨号后,mac mini也在dnspod 上更新了IP,但因为我在几分钟前刚访问绑定在家里mac上的域名。导致dns信息被cache,所以才需要清理它。
 
将上面的内容清入到一个sh文件。chmod +x 一下,再ln -sf 到/usr/bin目录下,就可以全局调用了。灰常方便
 

Mac PHP7 Lumen Event冲突

在使用Lumen进行开发的时候。如果你使用:./artisan的时候报错:Cannot declare class Event, because the name is already in use。检查一下LOG发现是:

XML/HTML代码
  1. [2016-12-07 15:27:37] lumen.ERROR: ErrorException: Cannot declare class Event, because the name is already in use in /home/web/vendor/laravel/lumen-framework/src/Application.php:661  
  2. Stack trace:  
  3. #0 [internal function]: Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(2, 'Cannot declare ...', '/Volumes/docume...', 661, Array)  
  4. #1 /home/web/vendor/laravel/lumen-framework/src/Application.php(661): class_alias('Illuminate\\Supp...', 'Event')  
  5. #2 /home/web/vendor/laravel/lumen-framework/src/Application.php(631): Laravel\Lumen\Application->withAliases(Array)  
  6. #3 /home/web/vendor/laravel/lumen-framework/src/Application.php(766): Laravel\Lumen\Application->withFacades(true)  
  7. #4 /home/web/vendor/laravel/lumen-framework/src/Console/Kernel.php(54): Laravel\Lumen\Application->prepareForConsoleCommand(true)  
  8. #5 [internal function]: Laravel\Lumen\Console\Kernel->__construct(Object(Laravel\Lumen\Application))  
  9. #6 /home/web/vendor/illuminate/container/Container.php(794): ReflectionClass->newInstanceArgs(Array)  
  10. #7 /home/web/vendor/illuminate/container/Container.php(644): Illuminate\Container\Container->build('App\\Console\\Ker...', Array)  
  11. #8 /home/web/vendor/laravel/lumen-framework/src/Application.php(211): Illuminate\Container\Container->make('App\\Console\\Ker...', Array)  
  12. #9 /home/web/vendor/illuminate/container/Container.php(231): Laravel\Lumen\Application->make('App\\Console\\Ker...', Array)  
  13. #10 /home/web/vendor/illuminate/container/Container.php(746): Illuminate\Container\Container->Illuminate\Container\{closure}(Object(Laravel\Lumen\Application), Array)  
  14. #11 /home/web/vendor/illuminate/container/Container.php(644): Illuminate\Container\Container->build(Object(Closure), Array)  
  15. #12 /home/web/vendor/laravel/lumen-framework/src/Application.php(211): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)  
  16. #13 /home/web/artisan(32): Laravel\Lumen\Application->make('Illuminate\\Cont...')  
  17. #14 {main}  

看了一下,Application.php的第661行对应的方法,我靠。

PHP代码
  1. /** 
  2.      * Register the aliases for the application. 
  3.      * 
  4.      * @param  array  $userAliases 
  5.      * @return void 
  6.      */  
  7.     public function withAliases($userAliases = [])  
  8.     {  
  9.         $defaults = [  
  10.             'Illuminate\Support\Facades\Auth' => 'Auth',  
  11.             'Illuminate\Support\Facades\Cache' => 'Cache',  
  12.             'Illuminate\Support\Facades\DB' => 'DB',  
  13.             'Illuminate\Support\Facades\Event' => 'Events',  
  14.             'Illuminate\Support\Facades\Gate' => 'Gate',  
  15.             'Illuminate\Support\Facades\Log' => 'Log',  
  16.             'Illuminate\Support\Facades\Queue' => 'Queue',  
  17.             'Illuminate\Support\Facades\Schema' => 'Schema',  
  18.             'Illuminate\Support\Facades\URL' => 'URL',  
  19.             'Illuminate\Support\Facades\Validator' => 'Validator',  
  20.         ];  
  21.   
  22.         if (! static::$aliasesRegistered) {  
  23.             static::$aliasesRegistered = true;  
  24.   
  25.             $merged = array_merge($defaults$userAliases);  
  26.             foreach ($merged as $original => $alias) {  
  27.                 class_alias($original$alias);  
  28.             }  
  29.         }  
  30.     }  

。。。。。怎么可以这样写呢?也不担心代码会不会冲突。就直接这样了??怪不得很多代码识别不了。更痛苦的是,前段时间为了测试命令行下的多线程,加载了:brew install php70-event,直接就冲突了。

不得已,brew remove php70-event。反正这个我也几乎用不到。哎~

所幸,搞定

 

 

 

Tags: lumen, event

Mac下载神器aria2

 说实话,本来不想转这篇博客的,但真的被百度搞死了。在百度云盘上下载东西,如果超过一定的大小,就非得让你装它的客户端。好吧,这我也忍了。然而装了客户端后,输入用户名和密码的登录的时候,一直提示:你当前的登录环境不安全。我在外面你说不安全也就算了,我在家里也还说不安全?忍无可忍的删除了。

然后有个朋友也是类似的情况,最后他曲线救国,先绑定一个社交账号,然后用社交账号登录。。。然而,我并不想这样。

Aria2是别人介绍的,于是我就google了一把,找到这篇文章。。http://www.jianshu.com/p/1290f8e7b326,转一下吧。也许有需要的人呢。

以下内容来自原网站:

从Windows上转过来,一直没找到一个和IDM一样优秀的下载软件,直到遇见「aria2」。

什么是aria2

aria2官网介绍:

aria2 is a lightweight multi-protocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink. aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.

简单来说就是有以下特性:

  • 支持多协议: HTTP / HTTPS,FTP,SFTP,BitTorrent和Metalink
  • 多线程连线:aria2 会自动从多个线程下载文件,并充分利用你的带宽;
  • 轻量:运行时不会占用过多资源,根据官方介绍,内存占用通常在 4MB~9MB,使用BitTorrent 协议,下行速度 2.8MB/s 时 CPU 占用率约 6%;
  • 全功能 BitTorrent 客户端,可以当BT客户端使用,抛弃迅雷。
  • 支持 RPC 界面远程控制

aria2的安装与使用

安装

方法有二

  1. aria2官网下载对应系统的安装包,双击安装。
  2. 使用homebrew安装: brew install aria2

配置

aria2 提供两种方式使用,一种是直接命令行模式下载,不推荐使用这种方法,推荐使用另外一种 RPC 模式,这种方式 aria 启动之后只会安静的等待下载请求,下载完成后也只会安静的驻留后台不会自动退出。而使用RPC模式推荐做一个配置文件方便使用。
新建一个名为aria2.conf的配置文件,复制下面的内容到文件内。

    #用户名     #rpc-user=user     #密码     #rpc-passwd=passwd     #上面的认证方式不建议使用,建议使用下面的token方式     #设置加密的密钥     #rpc-secret=token     #允许rpc     enable-rpc=true     #允许所有来源, web界面跨域权限需要     rpc-allow-origin-all=true     #允许外部访问,false的话只监听本地端口     rpc-listen-all=true     #RPC端口, 仅当默认端口被占用时修改     #rpc-listen-port=6800     #最大同时下载数(任务数), 路由建议值: 3     max-concurrent-downloads=5     #断点续传     continue=true     #同服务器连接数     max-connection-per-server=5     #最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要     min-split-size=10M     #单文件最大线程数, 路由建议值: 5     split=10     #下载速度限制     max-overall-download-limit=0     #单文件速度限制     max-download-limit=0     #上传速度限制     max-overall-upload-limit=0     #单文件速度限制     max-upload-limit=0     #断开速度过慢的连接     #lowest-speed-limit=0     #验证用,需要1.16.1之后的release版本     #referer=*     #文件保存路径, 默认为当前启动位置     dir=/User/xxx/Downloads     #文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用, 需要1.16及以上版本     #disk-cache=0     #另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)     #enable-mmap=true     #文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长     #所需时间 none < falloc ? trunc << prealloc, falloc和trunc需要文件系统和内核支持     file-allocation=prealloc

默认下载路径的「/Users/xxx/Downloads」可以改为任何你想要的绝对路径。此处写为 Downloads 目录,xxx 请自行替换成你的 Mac 用户名,然后保存,退出编辑器。

启动

在终端里面输入 aria2c --conf-path=<PATH>,将PATH换成刚刚保存的aria2.conf的绝对路径。比如说,aria2.conf是放在文档内,则PATH就是/Users/xxx/Documents/aria2.conf。可以使用 -D 参数使Aria2在后台运行,即使关闭终端也不会停止运行。
完整的运行命令如下: aria2c --conf-path="/Users/xxx/Documents/aria2.conf" -D,终端里输入这个aria2就启动了。关机或者关闭了aria2之后,重新启动都要输入这个命令,所以请保存好这个命令

如何关闭aria2呢,很简单:

可以到活动监视器中找到 aria2c 杀掉,也可以在终端输入kill aria2之后按 Tab 键,aria2 会自动变成进程号,回车即可杀掉它。

使用

启动完成就需要开始下载了,这就需要一个管理界面了。有两个很优秀的在线工具YAAWAria2 WebUI
。两个都很优秀随便选一个就好,我使用的是后者。
注: YAAW需要在界面的设置里输入http://localhost:6800/jsonrpc,Aria2 WebUI打开可直接使用。

高阶使用

如果经常在百度云上下载东西,配合BaiduExporter这个扩展就会非常方便好用了。
首先下载扩展,Chrome,Firefox和Safari都有:

  • Chrome
  • Firefox
  • Firefox(XPI):下载后打开 Firefox,Ctrl/Command + O 打开选择文件对话框选中 XPI 包即可安装。
  • Safari:下载后双击安装即可。
    安装完成后进入百度云的下载界面,会发现网页上多出一个「导出下载」按钮,点击它弹出的「ARIA2 RPC」就自动添加到你的下载队列里了。

大小: 111.35 K
尺寸: 500 x 188
浏览: 1551 次
点击打开新窗口浏览全图

感谢

这篇文章主要参考了少数派里的Mac 上使用百度网盘很烦躁?花点时间配置 aria2 吧这篇文章和BaiduExporter作者的介绍。感谢他们的总结和付出。

文/Vaayne(简书作者)

原文链接:http://www.jianshu.com/p/1290f8e7b326
---EOF---
原文中还有一张图,是用了Aria2 WebUI进行管理的,我是在命令行下。所以就没有贴。
原文还有件事没有提,那就是Chrome插件已经失效了,所以,你得到作者的github上去下载:https://github.com/acgotaku/BaiduExporter,并且开启Chrome的允许本地扩展(github的readme里有使用方法)
 
为什么插件会失效呢?可以看这个链接:查看链接(我真的找了半天才找到这个的)

 

Tags: aria2

【转】php-fpm的配置和优化

因为我是一直用apache的,所以对PHP-fpm的配置等没有什么特别的看法,再加上以前一直有vampire挡在前面,所以也没有想过那么多,当然这一篇也是仁者见仁,智者见智的内容。如果你之前什么都不了解,你就看一下。如果你已经了解了就一笑而过即可。

原文来自:https://www.zybuluo.com/phper/note/89081,转它还有一个小理由是文末介绍了php-fpm的慢日志,不过话说回来。我倒真是没有用过。所以记录一下下。

我在前面几篇中,很详细的讲述了php-fpm的各种介绍,和安装。今天来看一下它的配置文件php-fpm的各种配置以及一些常见的优化。

 php-fpm的安装目录

下面是我的平时的环境搭建php的各种安装目录,大家的基本也差不多。

 centos等linux平台
 
  1. /usr/local/php/php
  2. /usr/local/php/etc/php.ini
  3. /usr/local/php/sbin/php-fpm
  4. /usr/local/php/etc/php-fpm.conf
 mac平台
 
  1. /usr/bin/php
  2. /etc/php.ini
  3. /usr/bin/php-fpm
  4. /etc/php-fpm.conf

由于我开发以Mac为主,所以就用Mac的环境配置来学习。

 php-fpm配置详解

这是搜索的一份还算算比较详细的php-fpm.conf配置详解,我会针对性的修改下,当然php手册上也有详细的讲解:http://php.net/manual/zh/install.fpm.configuration.php

 
  1. pid = /usr/local/var/run/php-fpm.pid
  2. #pid设置,一定要开启,上面是Mac平台的。默认在php安装目录中的var/run/php-fpm.pid。比如centos的在: /usr/local/php/var/run/php-fpm.pid
  3.  
  4. error_log = /usr/local/var/log/php-fpm.log
  5. #错误日志,上面是Mac平台的,默认在php安装目录中的var/log/php-fpm.log,比如centos的在: /usr/local/php/var/log/php-fpm.log
  6.  
  7. log_level = notice
  8. #错误级别. 上面的php-fpm.log纪录的登记。可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
  9.  
  10. emergency_restart_threshold = 60
  11. emergency_restart_interval = 60s
  12. #表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。0 表示 '关闭该功能'. 默认值: 0 (关闭).
  13.  
  14. process_control_timeout = 0
  15. #设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
  16.  
  17. daemonize = yes
  18. #后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
  19.  
  20. listen = 127.0.0.1:9000
  21. #fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置。如果nginx和php在不同的机器上,分布式处理,就设置ip这里就可以了。
  22.  
  23. listen.backlog = -1
  24. #backlog数,设置 listen 的半连接队列长度,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41
  25.  
  26. listen.allowed_clients = 127.0.0.1
  27. #允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接。
  28.  
  29. listen.owner = www
  30. listen.group = www
  31. listen.mode = 0666
  32. #unix socket设置选项,如果使用tcp方式访问,这里注释即可。
  33.  
  34. user = www
  35. group = www
  36. #启动进程的用户和用户组,FPM 进程运行的Unix用户, 必须要设置。用户组,如果没有设置,则默认用户的组被使用。
  37.  
  38. pm = dynamic
  39. #php-fpm进程启动模式,pm可以设置为static和dynamic和ondemand
  40. #如果选择static,则进程数就数固定的,由pm.max_children指定固定的子进程数。
  41.  
  42. #如果选择dynamic,则进程数是动态变化的,由以下参数决定:
  43. pm.max_children = 50 #子进程最大数
  44. pm.start_servers = 2 #启动时的进程数,默认值为: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
  45. pm.min_spare_servers = 1 #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
  46. pm.max_spare_servers = 3 #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
  47.  
  48. pm.max_requests = 500
  49. #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
  50.  
  51. pm.status_path = /status
  52. #FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
  53.  
  54. ping.path = /ping
  55. #FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
  56.  
  57. ping.response = pong
  58. #用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
  59.  
  60. access.log = log/$pool.access.log
  61. #每一个请求的访问日志,默认是关闭的。
  62.  
  63. access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
  64. #设定访问日志的格式。
  65.  
  66. slowlog = log/$pool.log.slow
  67. #慢请求的记录日志,配合request_slowlog_timeout使用,默认关闭
  68.  
  69. request_slowlog_timeout = 10s
  70. #当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off'
  71.  
  72. request_terminate_timeout = 0
  73. #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。
  74.  
  75. rlimit_files = 1024
  76. #设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
  77.  
  78. rlimit_core = 0
  79. #设置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整数. 默认值: 系统定义值.
  80.  
  81. chroot =
  82. #启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
  83.  
  84. chdir =
  85. #设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
  86.  
  87. catch_workers_output = yes
  88. #重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.

当然还有一些无关紧要的设置,用到了再说吧。

 一些重要的设置
 php-fpm进程分配

在之前的文章中就说过了。在fasgcgi模式下,php会启动多个php-fpm进程,来接收nginx发来的请求,那是不是进程越多,速度就越快呢?这可不一定!得根据我们的机器配置和业务量来决定。

我们先来看下,设定进程的配置在哪里?

pm = static | dynamic | ondemand 

pm可以设置成这样3种,我们用的最多的就上前面2种。

 

pm = static 模式

pm = static 表示我们创建的php-fpm子进程数量是固定的,那么就只有pm.max_children = 50这个参数生效。你启动php-fpm的时候就会一起全部启动51(1个主+50个子)个进程,颇为壮观。

 

pm = dynamic 模式

pm = dynamic模式,表示启动进程是动态分配的,随着请求量动态变化的。他由 pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers 这几个参数共同决定。

上面已经讲过,这里再重申一下吧:

pm.max_children = 50 是最大可创建的子进程的数量。必须设置。这里表示最多只能50个子进程。

pm.start_servers = 20 随着php-fpm一起启动时创建的子进程数目。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。这里表示,一起启动会有20个子进程。

pm.min_spare_servers = 10 
设置服务器空闲时最小php-fpm进程数量。必须设置。如果空闲的时候,会检查如果少于10个,就会启动几个来补上。

pm.max_spare_servers = 30 
设置服务器空闲时最大php-fpm进程数量。必须设置。如果空闲时,会检查进程数,多于30个了,就会关闭几个,达到30个的状态。

 

到底选择static还数dynamic?

很多人恐惧症来袭,不知道选什么好?

一般原则是:动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗。

如果你的内存很大,有8-20G,按照一个php-fpm进程20M算,100个就2G内存了,那就可以开启static模式。如果你的内存很小,比如才256M,那就要小心设置了,因为你的机器里面的其他的进程也算需要占用内存的,所以设置成dynamic是最好的,比如:pm.max_chindren = 8, 占用内存160M左右,而且可以随时变化,对于一半访问量的网站足够了。

 

慢日志查询

我们有时候会经常饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

这个时候,我们是可以开启慢日志功能的。

slowlog = /usr/local/var/log/php-fpm.log.slow request_slowlog_timeout = 15s 

当一个请求该设置的超时时间15秒后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。

php-fpm慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长:

 
  1. [21-Nov-2013 14:30:38] [pool www] pid 11877
  2. script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php
  3. [0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2

通过日志,我们就可以知道第2行的file_get_contents 函数有点问题,这样我们就能追踪问题了。

----EOF----