3000并发流量计算
Unix/LinuxC技术 jackxiang 2016-5-6 12:13
设备采用长连接与IoT Socket Server保持连接,不断开。每隔0.5秒上传一次数据,报文长度<200B。压测使用50组长连接为基数,从50,100,150,200,250,300,每隔50基数做测试。此事发现:CPU占用率维持在25%左右,出网带宽维持在125kbps,但是入网带宽随着压测而上升到500kbps。由于IDC入网带宽统计严重滞后于出网带宽。出现非实时的出网带宽统计,甚至绘图不完整。只能够推测数值。
但是由于外网带宽总数在1Mbps,所以300台左右时,总带宽大约在600~700kbps左右,此时TeraTerm输入命令已经感觉到了延时。
结论
1Mbps带宽是系统瓶颈,即使采用高配服务器并不能够改善并实现高并发的IO连接数。
但实际上,每0.5秒发送200B,相当于400 B/s = 3.2kbps。而1Mbps支持300台设备,相当于每台占用带宽为3.5kbps。
来自:https://segmentfault.com/q/1010000004214610
300个是125kbps啊,,我说的呢,
3000 = 1250kbps
1250/8 = 416kbps 如果说是要很密集还得x参数
416.66666666666666666666666666667
uerdel删除用户时候提示:userdel: user ** is currently logged in
今天在删除用户账号的时候,发现一个奇怪现象,即:
#userdel -r aaron
userdel: user aaron is currently logged in
解决方法:
mv /var/run/utmp /var/run/utmp_old //将原文件改名
touch > /var/run/utmp //新创建一同名文件
再次执行删除操作。。。成功删除用户
关于:/var/run/utmp
utmp是一个文件,除了utmp程序你不能编辑这个文件,删掉他的话,当前登陆信息都会丢失。这个文件在每次机器reboot起来后都会重新创建。
更多关于utmp文件介绍请参考下面说明:
/var/run/utmp
该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。
(/var/log/wtmp、/var/log/utmp、/var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的具体的数据结构可以使用man命令查询。
每次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写到标准输出中,然后login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。utmp文件被各种命令使用,包括who、w、users和finger。
下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。
但是,本人自己试验了还是不行,依旧得到同样的提示
那就暴力删除该用户吧:
$userdel -r -f XXXX
提示:userdel: warning: can't remove /var/mail/git: No such file or directory
userdel: git home directory (/home/git) not found
但是没关系。实际上已成功删除用户。
来自:http://www.2cto.com/os/201408/328936.html
今天在删除用户账号的时候,发现一个奇怪现象,即:
#userdel -r aaron
userdel: user aaron is currently logged in
解决方法:
mv /var/run/utmp /var/run/utmp_old //将原文件改名
touch > /var/run/utmp //新创建一同名文件
再次执行删除操作。。。成功删除用户
关于:/var/run/utmp
utmp是一个文件,除了utmp程序你不能编辑这个文件,删掉他的话,当前登陆信息都会丢失。这个文件在每次机器reboot起来后都会重新创建。
更多关于utmp文件介绍请参考下面说明:
/var/run/utmp
该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。
(/var/log/wtmp、/var/log/utmp、/var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的具体的数据结构可以使用man命令查询。
每次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写到标准输出中,然后login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。utmp文件被各种命令使用,包括who、w、users和finger。
下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。
但是,本人自己试验了还是不行,依旧得到同样的提示
那就暴力删除该用户吧:
$userdel -r -f XXXX
提示:userdel: warning: can't remove /var/mail/git: No such file or directory
userdel: git home directory (/home/git) not found
但是没关系。实际上已成功删除用户。
来自:http://www.2cto.com/os/201408/328936.html
ERR_CACHE_MISS 搜尋回上一頁空白或錯誤
Php/Js/Shell/Go jackxiang 2016-5-5 11:20
问题:
确认重新提交表单
此网页需要使用您之前输入的数据才能正常显示。您可以重新发送这些数据,不过,这么做会重复执行此网页之前执行过的所有操作。
按“重新加载”按钮,重新提交加载该网页所需的数据。
ERR_CACHE_MISS
————————————————————————————————————————————————————————————————
瀏覽很多網站後都會發生一個小問題,那就是瀏覽搜尋結果,當我點近物件後,再使用瀏覽器的回上一頁功能,就會出現空白頁面,並出現錯誤,以chrome為例,如下:
這個網頁需要使用您先前輸入的資料才能正確顯示。您可以重新傳送這些資料,不過這麼做會重複執行這個網頁先前執行過的任何動作。
重新載入這個網頁。
按下重新載入按鈕,重新提交載入網頁所需的資料。
錯誤代碼:ERR_CACHE_MISS
這通常是搜尋頁面為a.php把搜尋的結果置入b.php,當我們把搜尋結果點進去看物件的時候,就是c.php畫面,所以一般來說瀏覽器回上一頁就是進入b.php,但是問題是b.php並沒有任何值的載入,所以就會發生空白頁面與錯誤代碼:ERR_CACHE_MISS的問題,解決的方式很簡單,就是在a.php放入下一段
如此,輕鬆解決問題,當然還有人會把傳輸的值把它存成cookie/session,這也都是解決辦法喔!
来自:http://blog.csdn.net/a9925/article/details/42027229
确认重新提交表单
此网页需要使用您之前输入的数据才能正常显示。您可以重新发送这些数据,不过,这么做会重复执行此网页之前执行过的所有操作。
按“重新加载”按钮,重新提交加载该网页所需的数据。
ERR_CACHE_MISS
————————————————————————————————————————————————————————————————
瀏覽很多網站後都會發生一個小問題,那就是瀏覽搜尋結果,當我點近物件後,再使用瀏覽器的回上一頁功能,就會出現空白頁面,並出現錯誤,以chrome為例,如下:
這個網頁需要使用您先前輸入的資料才能正確顯示。您可以重新傳送這些資料,不過這麼做會重複執行這個網頁先前執行過的任何動作。
重新載入這個網頁。
按下重新載入按鈕,重新提交載入網頁所需的資料。
錯誤代碼:ERR_CACHE_MISS
這通常是搜尋頁面為a.php把搜尋的結果置入b.php,當我們把搜尋結果點進去看物件的時候,就是c.php畫面,所以一般來說瀏覽器回上一頁就是進入b.php,但是問題是b.php並沒有任何值的載入,所以就會發生空白頁面與錯誤代碼:ERR_CACHE_MISS的問題,解決的方式很簡單,就是在a.php放入下一段
如此,輕鬆解決問題,當然還有人會把傳輸的值把它存成cookie/session,這也都是解決辦法喔!
来自:http://blog.csdn.net/a9925/article/details/42027229
务实至上:“PHP之父”Rasmus Lerdorf访谈录
Php/Js/Shell/Go jackxiang 2016-5-5 11:17
“PHP之父”Rasmus Lerdorf性格直接坦荡,措辞简练精辟,字里行间透着一股“务实至上”的精神气。在参加“PHP全球开发者大会”前夕,这位“实干家”接受了《程序员》采访,分享了自己的编程感悟。
工作重心
我参与的项目总与用户直接相关。我曾多年担任雅虎工程师,负责连接数亿终端用户的基础设施,这些基础设置仍在服役。而如今,我在Etsy也是负责连接百万用户的后端基础设施。技术其实只是解决问题的工具,是抽象的锤头、锯子,并没什么了不起,而真正振奋人心的是用技术提升了百万人的生活品质。
“问题”为指引
比起“计算机科学家”,“工程师”的称谓更得我心。论这两者的区别,我认为后者更专注于解决眼前的问题。之所以开发PHP,并非因为我喜爱编程或语言设计,反倒是因为不喜欢。1993年的那套编程把式,让我没法轻松迅捷地解决Web问题。于我而言,只有当遇到困难,才会翻翻书,查查资料来充实自己,技能不是为了提高而提高,我的每一个决定都是以解决问题为中心的。
经验与教训
我犯了很多错,有些事后才意识到;但也取得过好于预期的成果。最重要的经验是:解决Web问题的确应该从一开始就专注相关的整个生态系统。20年来,针对Web问题的解决方案层出不穷,而质量却参差不齐,没几个能构建起完整的生态圈,并为普通人所用。
PHP 7何处费思量?
开发PHP 7那最后10%最费时,也最无趣。不过强大的新功能和性能突飞猛进,还是让积极心态占了上风,也激励了整个团队,帮我们很快熬了过去。不过,每次更新都有做不完的测试、解决不完的平台问题,调查不完的诡异边缘情况,看不完的漏洞报告,没个尽头。
吸纳新人
我知道前不久Emacs的版本控制系统从BZR换成了Git,不过对于吸纳新贡献者,我觉得它们其实平分秋色。Git近来更受欢迎,方便蜻蜓点水式的添砖加瓦。不过对于长期的忠实贡献者,版本控制系统无关紧要。良好的文档和方便新贡献的流程才重要呢。
假如能重新设计PHP
假如时光能倒流,肯定有我希望能改进的地方,比如区分Keyword大小写。刚开始PHP不过是种HTML模板语言。九十年代初,人们争论HTML标签是该大写、小写还是大小写混合。我不想争来争去的,就把PHP的模版标签做成不区分大小写的,这个做法至今还在沿用。
JavaScript在吞噬其他语言吗?
PHP和JavaScript的演进几乎同步。我与Brendan Eich(JavaScript设计者)是同一时期开始的,他的重心显而易见是客户端,而我则是服务器。如果你写客户端应用,除了JavaScript,别无选择——浏览器支持哪种语言就得用哪种;但如果重心是服务器就很不一样了。
写客户端代码者众,所以会JavaScript的人多,而如今它在服务器这厢也开花结果了。但JavaScript跟PHP一样只是解决方案之一,而非唯一,这样挺好。就像我刚说的,语言只是解决问题的工具,不是受人膜拜的宗教。如果眼前有问题,而你更倾向于JavaScript,那么它就是最佳选择。
编程原则
只要有效、安全、够快,就发布,然后解决下个问题。三者缺一不可,否则就要回头检查代码,好抓紧时间解决下一个问题。
未来展望
关于编程语言,我还真没想过这些工具未来会经历什么,我更关心的是它们能否解决当下的问题。拿Etsy举例,作为手工工艺品网站,它能在富有的买家和穷苦艺术家之间牵线搭桥,让他们摆脱贫穷的窘境吗?我们的基础设施能帮助其他公司去应对同等重大的问题吗?我们的解决方案是否强大到一转眼客户的问题就去无踪了呢?这些才是我关心的。
过去,我不喜欢编程,现在还是不咋喜欢。我只喜欢以解决问题为中心,这点永远不变。
工作重心
我参与的项目总与用户直接相关。我曾多年担任雅虎工程师,负责连接数亿终端用户的基础设施,这些基础设置仍在服役。而如今,我在Etsy也是负责连接百万用户的后端基础设施。技术其实只是解决问题的工具,是抽象的锤头、锯子,并没什么了不起,而真正振奋人心的是用技术提升了百万人的生活品质。
“问题”为指引
比起“计算机科学家”,“工程师”的称谓更得我心。论这两者的区别,我认为后者更专注于解决眼前的问题。之所以开发PHP,并非因为我喜爱编程或语言设计,反倒是因为不喜欢。1993年的那套编程把式,让我没法轻松迅捷地解决Web问题。于我而言,只有当遇到困难,才会翻翻书,查查资料来充实自己,技能不是为了提高而提高,我的每一个决定都是以解决问题为中心的。
经验与教训
我犯了很多错,有些事后才意识到;但也取得过好于预期的成果。最重要的经验是:解决Web问题的确应该从一开始就专注相关的整个生态系统。20年来,针对Web问题的解决方案层出不穷,而质量却参差不齐,没几个能构建起完整的生态圈,并为普通人所用。
PHP 7何处费思量?
开发PHP 7那最后10%最费时,也最无趣。不过强大的新功能和性能突飞猛进,还是让积极心态占了上风,也激励了整个团队,帮我们很快熬了过去。不过,每次更新都有做不完的测试、解决不完的平台问题,调查不完的诡异边缘情况,看不完的漏洞报告,没个尽头。
吸纳新人
我知道前不久Emacs的版本控制系统从BZR换成了Git,不过对于吸纳新贡献者,我觉得它们其实平分秋色。Git近来更受欢迎,方便蜻蜓点水式的添砖加瓦。不过对于长期的忠实贡献者,版本控制系统无关紧要。良好的文档和方便新贡献的流程才重要呢。
假如能重新设计PHP
假如时光能倒流,肯定有我希望能改进的地方,比如区分Keyword大小写。刚开始PHP不过是种HTML模板语言。九十年代初,人们争论HTML标签是该大写、小写还是大小写混合。我不想争来争去的,就把PHP的模版标签做成不区分大小写的,这个做法至今还在沿用。
JavaScript在吞噬其他语言吗?
PHP和JavaScript的演进几乎同步。我与Brendan Eich(JavaScript设计者)是同一时期开始的,他的重心显而易见是客户端,而我则是服务器。如果你写客户端应用,除了JavaScript,别无选择——浏览器支持哪种语言就得用哪种;但如果重心是服务器就很不一样了。
写客户端代码者众,所以会JavaScript的人多,而如今它在服务器这厢也开花结果了。但JavaScript跟PHP一样只是解决方案之一,而非唯一,这样挺好。就像我刚说的,语言只是解决问题的工具,不是受人膜拜的宗教。如果眼前有问题,而你更倾向于JavaScript,那么它就是最佳选择。
编程原则
只要有效、安全、够快,就发布,然后解决下个问题。三者缺一不可,否则就要回头检查代码,好抓紧时间解决下一个问题。
未来展望
关于编程语言,我还真没想过这些工具未来会经历什么,我更关心的是它们能否解决当下的问题。拿Etsy举例,作为手工工艺品网站,它能在富有的买家和穷苦艺术家之间牵线搭桥,让他们摆脱贫穷的窘境吗?我们的基础设施能帮助其他公司去应对同等重大的问题吗?我们的解决方案是否强大到一转眼客户的问题就去无踪了呢?这些才是我关心的。
过去,我不喜欢编程,现在还是不咋喜欢。我只喜欢以解决问题为中心,这点永远不变。
背景:用阿里云编译mysql5.7.12时在编译一半时出现错误,如下:
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_cmpfunc.cc.o
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_create.cc.o
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_func.cc.o
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_geofunc.cc.o
c++: 编译器内部错误:已杀死(程序 cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] 错误 4
make[1]: *** [sql/CMakeFiles/sql.dir/all] 错误 2
make: *** [all] 错误 2
不要感觉奇怪,其实是内存不够导致的,这位兄弟也遇到一样的问题,如下:
在这里特别提醒, 对于mysql5.7.8的make编译, 如果是阿里云centos主机512M内存的, 会在make编译到45%时会报错, 这是内存不足所致。
c++: Internal error: Killed (program cc1plus)
Please submit a full bug report.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 1
make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2
make: *** [all] Error 2
那么设置2G交换分区来用下 :
# dd if=/dev/zero of=/swapfile bs=1k count=2048000 --获取要增加的2G的SWAP文件块
# mkswap /swapfile -- 创建SWAP文件
# swapon /swapfile -- 激活SWAP文件
# swapon -s -- 查看SWAP信息是否正确
# echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab -- 添加到fstab文件中让系统引导时自动启动
注意, swapfile文件的路径在/var/下
编译完后, 如果不想要交换分区了, 可以删除:
# swapoff /swapfile
# rm -fr /swapfile
部分摘录自:http://blog.csdn.net/cryhelyxx/article/details/47610247
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_cmpfunc.cc.o
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_create.cc.o
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_func.cc.o
[ 50%] Building CXX object sql/CMakeFiles/sql.dir/item_geofunc.cc.o
c++: 编译器内部错误:已杀死(程序 cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] 错误 4
make[1]: *** [sql/CMakeFiles/sql.dir/all] 错误 2
make: *** [all] 错误 2
不要感觉奇怪,其实是内存不够导致的,这位兄弟也遇到一样的问题,如下:
在这里特别提醒, 对于mysql5.7.8的make编译, 如果是阿里云centos主机512M内存的, 会在make编译到45%时会报错, 这是内存不足所致。
c++: Internal error: Killed (program cc1plus)
Please submit a full bug report.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 1
make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2
make: *** [all] Error 2
那么设置2G交换分区来用下 :
# dd if=/dev/zero of=/swapfile bs=1k count=2048000 --获取要增加的2G的SWAP文件块
# mkswap /swapfile -- 创建SWAP文件
# swapon /swapfile -- 激活SWAP文件
# swapon -s -- 查看SWAP信息是否正确
# echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab -- 添加到fstab文件中让系统引导时自动启动
注意, swapfile文件的路径在/var/下
编译完后, 如果不想要交换分区了, 可以删除:
# swapoff /swapfile
# rm -fr /swapfile
部分摘录自:http://blog.csdn.net/cryhelyxx/article/details/47610247
背景:用raspberry pi+chrome做了一个孵化小鸡的硬件,当时想用websocket,好像没有,想用svg画温度曲线,好像测试了一下也没有,最后用的ajax轮训,后面不知这个新出的版本有没有加上。
Chromium OS for Raspberry Pi 3 0.5版本发布:
下载:download the Chromium OS for Raspberry Pi 3 0.5 binary image
当时被问及Chromium OS是否会移植到树莓派3的时候,Callahan表示已经购买了两台树莓派3,并确认将会得到扩展支持。而现在,Callahan非常高兴的宣布面向树莓派3单板电脑的0.5版本。树莓派3 Model B于2016年2月29日正式发布,支持WiFi和蓝牙,并内部包含64位四核ARM Cortex-A53处理器。
团队表示尽管在树莓派2的基础上开发移植Chromium OS for 树莓派3,但是在0.5版本依然带来了很多新特性。首先提到的是已经压缩尺寸的Linux 4.2.8-ckt8内核,BFS优化、更少的调试输出,且没有Dynamic tick模块,声卡驱动的多重改善,借助BFQ分级调度和按需调度的优化调整带来更好的储存性能。
Chromium OS for Raspberry Pi 3 0.5版本发布:
下载:download the Chromium OS for Raspberry Pi 3 0.5 binary image
当时被问及Chromium OS是否会移植到树莓派3的时候,Callahan表示已经购买了两台树莓派3,并确认将会得到扩展支持。而现在,Callahan非常高兴的宣布面向树莓派3单板电脑的0.5版本。树莓派3 Model B于2016年2月29日正式发布,支持WiFi和蓝牙,并内部包含64位四核ARM Cortex-A53处理器。
团队表示尽管在树莓派2的基础上开发移植Chromium OS for 树莓派3,但是在0.5版本依然带来了很多新特性。首先提到的是已经压缩尺寸的Linux 4.2.8-ckt8内核,BFS优化、更少的调试输出,且没有Dynamic tick模块,声卡驱动的多重改善,借助BFQ分级调度和按需调度的优化调整带来更好的储存性能。
安卓端的微信使用的是一个自带的专用浏览器,应该是一个精简版的qq浏览器。然后就造成了我们一系列蛋疼的问题,各种不兼容。而ios端的微信无疑问用的是内置safari浏览器,不管是canvas运算还是类似todataurl这样对运算能力要求比较高的API,在上面的实现都挺流畅的。
作者:陈秋鑫
链接:https://www.zhihu.com/question/23595715/answer/36213456
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:陈秋鑫
链接:https://www.zhihu.com/question/23595715/answer/36213456
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关于异步任务队列之PHP使用swoole来实现实时异步任务队列。
Php/Js/Shell/Go jackxiang 2016-4-27 09:50
背景:关于PHP的异步回调啥的,其实PHP这种语言的运行机制想优雅实现是不可能的,有一个叫swoole的扩展实现这个队列的处理是很不错的,之前有张宴兄弟写过一个叫https的队列处理(基于libevent),后面有韩天峰兄弟写的swoole,更注重了异步IO实现对CPU的IO的吃满(基于自己编写的epoll加队列链表内存分配一堆东西,反正我是看过没看明白有空再研究),但是,作为swoole的粉丝兼顾问,异步问题在PHP业界的一个需求量还是蛮大的,尤其是日志异步写、url访问、邮件异步发、跨机房db特殊的小同步、审核异步队列、框架底层对接口访问排查错误的db和cache接口查询及返回,这些目前对于大并发网站都是需要异步来解决的,但是异步归异步,回调这块也实现异步回调(真大并发想知道结果可能阻塞了PHP进程产生进程等待异步返回而新来的连接没法及时处理的php-fpm进程性雪崩),在实际运用中常规处理办法是开一个新的端口,下面的swoole也是开了新的端口来处理,于httpsqs不同在于swoole可以把简单的curl啥的逻辑也可封装里面,在httpsqs里只是纯队列,一个投递进来,再起一个php的daemon进行读取队列,因为如果真是繁忙,导致异步处理返回慢,这个等待也是太漫长,我觉得看具体业务而看要不要等待,在实际中异步和队列大都用于抛数据以及解耦,swoole在这块不光有了异步还有异步回调,所以,最大限度的解决了上面这些场景,先抄一篇文章再说,有空再研究研究其实现,假如能看懂的话:-),异步回调这块如果有明白的可以留言给我,谢谢。
————————————————————————————————————————————————————————————————————————
关于异步任务队列
用户打开了我们的网站。他要做的就是勾选需要发邮件的代理商列表,然后把结算邮件发出去。
假如我们需要发1封邮件,我们写个函数执行即可。考虑到网络可能会稍微有点延迟,但是是可以接受的,用户会乖乖等你的网页发完邮件了再关闭网页。
假如我们要发布10封邮件,用一个for循环,循环10遍执行发邮件操作。这时候,也许10倍的网络延迟会让用户稍微有点不耐烦,但勉强可以等吧。
假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站!
但实际上,我们很可能有超过1万的邮件。怎么处理这个延迟的问题?
答案就是用异步。把“发邮件”这个操作封装,然后后台异步地执行1万遍。这样的话,用户提交网页后,他所等待的时间只是“把发邮件任务请求推送进队列里”的时间。而我们的后台服务将在用户看不见的地方跑。
在实现“异步队列”这点上,有人采用mysql表或者redis来存放待发送的邮件,然后,每分钟定时读取待发送列表,然后处理。这便是定时异步任务队列。但当前提交的任务要一分钟后才能执行,在某些实时性要求应用场景里还是不快。有些场景要求,只有一提交任务,便马上执行,但用户不需要等待返回结果。
在云平台SAE和BAE上,都有taskqueue服务来解决上面的问题。而如果是自己假设服务器,则如何解决?本文将探讨用php扩展swoole实现实时异步任务队列的方案。
安装swoole
pecl 安装:
pecl install swoole
看命令行提示,如果它提示说没有写php.ini,则自己手动在PHP.ini后面加上:
extension = "swoole.so"
服务端
在打算放置脚本的目录(你也可以自行新建)新建Server.php,代码如下:
由于服务端是异步、常驻内存的,因此必须通过命令行来启动。在命令行执行以上代码以启动服务
php Server.php
执行完毕后关闭命令行窗口即可。服务会在后台以守护进程运行
客户端
启动服务后,让我们看看如何调用服务。新建测试文件Client_test.php
代码如下:
在上面代码中,url即为任务所在地址,param为所需传递参数。
保存好代码,在命令行或者浏览器中执行Client_test.php,便实现了异步任务队列。你所填写的URL,将会在每次异步任务被提交后,以HTTP GET的方式异步执行。
查看与关闭
swoole好像没有很便捷的关闭方式。所以只能直接通过关闭进程来关闭。
查看命令:
ps -ef | grep php
结束单个进程:
kill -9 {进程号}
结束所有进程的命令:
killall -9 php
摘自第七星尘的博客:http://blog.star7th.com/2016/01/1905.html
————————————————————————————————————————————————————————————————————————
关于异步任务队列
用户打开了我们的网站。他要做的就是勾选需要发邮件的代理商列表,然后把结算邮件发出去。
假如我们需要发1封邮件,我们写个函数执行即可。考虑到网络可能会稍微有点延迟,但是是可以接受的,用户会乖乖等你的网页发完邮件了再关闭网页。
假如我们要发布10封邮件,用一个for循环,循环10遍执行发邮件操作。这时候,也许10倍的网络延迟会让用户稍微有点不耐烦,但勉强可以等吧。
假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站!
但实际上,我们很可能有超过1万的邮件。怎么处理这个延迟的问题?
答案就是用异步。把“发邮件”这个操作封装,然后后台异步地执行1万遍。这样的话,用户提交网页后,他所等待的时间只是“把发邮件任务请求推送进队列里”的时间。而我们的后台服务将在用户看不见的地方跑。
在实现“异步队列”这点上,有人采用mysql表或者redis来存放待发送的邮件,然后,每分钟定时读取待发送列表,然后处理。这便是定时异步任务队列。但当前提交的任务要一分钟后才能执行,在某些实时性要求应用场景里还是不快。有些场景要求,只有一提交任务,便马上执行,但用户不需要等待返回结果。
在云平台SAE和BAE上,都有taskqueue服务来解决上面的问题。而如果是自己假设服务器,则如何解决?本文将探讨用php扩展swoole实现实时异步任务队列的方案。
安装swoole
pecl 安装:
pecl install swoole
看命令行提示,如果它提示说没有写php.ini,则自己手动在PHP.ini后面加上:
extension = "swoole.so"
服务端
在打算放置脚本的目录(你也可以自行新建)新建Server.php,代码如下:
由于服务端是异步、常驻内存的,因此必须通过命令行来启动。在命令行执行以上代码以启动服务
php Server.php
执行完毕后关闭命令行窗口即可。服务会在后台以守护进程运行
客户端
启动服务后,让我们看看如何调用服务。新建测试文件Client_test.php
代码如下:
在上面代码中,url即为任务所在地址,param为所需传递参数。
保存好代码,在命令行或者浏览器中执行Client_test.php,便实现了异步任务队列。你所填写的URL,将会在每次异步任务被提交后,以HTTP GET的方式异步执行。
查看与关闭
swoole好像没有很便捷的关闭方式。所以只能直接通过关闭进程来关闭。
查看命令:
ps -ef | grep php
结束单个进程:
kill -9 {进程号}
结束所有进程的命令:
killall -9 php
摘自第七星尘的博客:http://blog.star7th.com/2016/01/1905.html
ubuntu16.0.4 系统中chrome浏览器chromium的代理配置。
Unix/LinuxC技术 jackxiang 2016-4-25 21:31
实践发现,ubunut16.0.4里面的chromium没法设置代理的,而是采用了下面这个办法进行命令行设置:
在受支持的桌面环境中运行Chromium时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man chromium-browser。
=========================================================================================
先安装再代理 ,安装后可以google: http://jackxiang.com/post/8703/
受支持的桌面环境中运行Chromium时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man chromium-browser。
安装好google-chrome(或者chromium也行)后,我们发现浏览器的设置中,代理配置功能失效,显示为:
在受支持的桌面环境中运行google-chrome时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man google-chrome。
2、关闭该google-chrome,并重新从命令行启动,加入一个参数:
jackX@thinkpad:~$ google-chrome --proxy-server="socks5://localhost:8787"
chromium-browser --proxy-server="socks5://localhost:8787"
值得注意的是,由于我平常windows环境下使用的代理工具为:chrome+SwitchyOmega插件+MyEntunnel,配置是SSH+socks5,所以一开始没有在–proxy-server参数中指定socks5,导致启动后代理失效。(可通过google-chrome –help了解详细参数)
chrome成功启动后,打开百度输入“ip”,可显示我的代理服务器IP,说明代理成功启用。
在受支持的桌面环境中运行Chromium时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man chromium-browser。
=========================================================================================
先安装再代理 ,安装后可以google: http://jackxiang.com/post/8703/
受支持的桌面环境中运行Chromium时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man chromium-browser。
安装好google-chrome(或者chromium也行)后,我们发现浏览器的设置中,代理配置功能失效,显示为:
在受支持的桌面环境中运行google-chrome时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man google-chrome。
2、关闭该google-chrome,并重新从命令行启动,加入一个参数:
jackX@thinkpad:~$ google-chrome --proxy-server="socks5://localhost:8787"
chromium-browser --proxy-server="socks5://localhost:8787"
值得注意的是,由于我平常windows环境下使用的代理工具为:chrome+SwitchyOmega插件+MyEntunnel,配置是SSH+socks5,所以一开始没有在–proxy-server参数中指定socks5,导致启动后代理失效。(可通过google-chrome –help了解详细参数)
chrome成功启动后,打开百度输入“ip”,可显示我的代理服务器IP,说明代理成功启用。
修改 visudo 默认编辑器,visudo默认编辑器修改之Ubuntu / Debian 快速修改預設編輯器(nano -> vim),如何在ubuntu中设置visudo的默认编辑器.
Unix/LinuxC技术 jackxiang 2016-4-23 21:59
[root@jackX ~]# vi /etc/sudoers
在 /etc/sudoers 中添加:
Defaults editor=/usr/bin/vim, env_editor
即可将默认编辑器设置为 vim。
apt-get install vim
root@jack:~# which vim
/usr/bin/vim
[root@jackX ~]# update-alternatives --config editor
有 4 个候选项可用于替换 editor (提供 /usr/bin/editor)。
选择 路径 优先级 状态
------------------------------------------------------------
* 0 /bin/nano 40 自动模式
1 /bin/ed -100 手动模式
2 /bin/nano 40 手动模式
3 /usr/bin/vim.basic 30 手动模式
4 /usr/bin/vim.tiny 10 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:3
update-alternatives: 使用 /usr/bin/vim.basic 来在手动模式中提供 /usr/bin/editor (editor)
From:http://blog.longwin.com.tw/2008/10/ubuntu-debian-modify-default-edit-2008/
在 /etc/sudoers 中添加:
Defaults editor=/usr/bin/vim, env_editor
即可将默认编辑器设置为 vim。
apt-get install vim
root@jack:~# which vim
/usr/bin/vim
[root@jackX ~]# update-alternatives --config editor
有 4 个候选项可用于替换 editor (提供 /usr/bin/editor)。
选择 路径 优先级 状态
------------------------------------------------------------
* 0 /bin/nano 40 自动模式
1 /bin/ed -100 手动模式
2 /bin/nano 40 手动模式
3 /usr/bin/vim.basic 30 手动模式
4 /usr/bin/vim.tiny 10 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:3
update-alternatives: 使用 /usr/bin/vim.basic 来在手动模式中提供 /usr/bin/editor (editor)
From:http://blog.longwin.com.tw/2008/10/ubuntu-debian-modify-default-edit-2008/
[实践失败]Ubuntu 16.0.4 不能安裝flash
Unix/LinuxC技术 jackxiang 2016-4-23 16:01
chrome和firefox都没法使用Flash:
sudo apt-get install software-center
http://tieba.baidu.com/p/4395787288
sudo apt-get install software-center
http://tieba.baidu.com/p/4395787288
怎样在ubuntu 17.04的终端中,将其设置为,选中就复制,右键就粘贴
Unix/LinuxC技术 jackxiang 2016-4-23 15:23
ubuntu 17.04是gnome桌面环境的话,用鼠标左键选中区域,然后滚轮按下就可以黏贴刚才内容
在ubuntu下,选择文本会自动复制,按中键即可粘贴,这个是不用设置的,不过是中键,很不错
在ubuntu下,选择文本会自动复制,按中键即可粘贴,这个是不用设置的,不过是中键,很不错
centos系列教程之一更改yum源为aliyun
Unix/LinuxC技术 jackxiang 2016-4-22 19:42
更改yum源为aliyun
[1] 首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[2] 进入yum源配置文件所在文件夹
[root@localhost yum.repos.d]# cd /etc/yum.repos.d/
[3] 下载aliyun的yum源配置文件,放入/etc/yum.repos.d/(操作前请做好相应备份)
[root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-6.repo
如果下载163的yum源配置文件
[root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
[4] 运行yum makecache生成缓存
[root@localhost yum.repos.d]# yum makecache
[5] 更新系统
[root@localhost yum.repos.d]# yum -y update
[1] 首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[2] 进入yum源配置文件所在文件夹
[root@localhost yum.repos.d]# cd /etc/yum.repos.d/
[3] 下载aliyun的yum源配置文件,放入/etc/yum.repos.d/(操作前请做好相应备份)
[root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-6.repo
如果下载163的yum源配置文件
[root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
[4] 运行yum makecache生成缓存
[root@localhost yum.repos.d]# yum makecache
[5] 更新系统
[root@localhost yum.repos.d]# yum -y update
背景:最近研究一下rpmbuild打的mysql最新包出现初始化mysql-5.7.12时的数据库错误,[ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1',再涉及到mysql的密码问题居然放error.log里了。
1)init database and set password:
[root@localhost bin]#./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
2016-04-21T03:26:22.900370Z 0 [ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
2016-04-21T03:26:22.900452Z 0 [ERROR] Aborting
2)try directly start mysql server display:
[root@localhost bin]# ./mysqld_safe
./mysqld_safe: line 541: /data/mysql/mysqld_safe.pid: No such file or directory
awk: (FILENAME=- FNR=1) warning: error writing standard output (Broken pipe)
2016-04-21T03:26:28.773480Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T03:26:28.814486Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
2016-04-21T03:26:28.957913Z mysqld_safe mysqld from pid file /data/mysql/mysql.pid ended
so,tail -f ,tail -f /data/logs/mysql/error.log
乍一看,是字符编码问题,着实在my.cnf配置文件上面设置了字符编码如下:
再启动,出现新的报错:
可能是目录的权限问题,继续在rpmbuild里写上权限....
chmod -R mysql.mysql /data/logs/mysql /data/mysql
[root@localhost bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
[root@localhost bin]#
日志跟踪,敬告没有Error:
2016-04-21T03:45:21.971611Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971676Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971712Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971745Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.972041Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
立即启动mysqld_safe:
[root@localhost bin]# ./mysqld_safe
2016-04-21T03:47:08.025776Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T03:47:08.075873Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
tail -f /data/logs/mysql/error.log 端口成功启动:
2016-04-21T03:47:08.542210Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.12-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
[root@localhost bin]# ./mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
重新初始化mysql用户名及密码:
[root@localhost bin]# ./bin/mysql_install_db --basedir=. --datadir=/data/mysql --user=mysql
2016-04-21 13:18:24 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-04-21 13:18:24 [ERROR] The data directory needs to be specified.
之前版本mysql_install_db是在mysql_basedir/script下,5.7放在了mysql_install_db/bin目录下,且已被废弃。
shell>./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
******mysql5.7会生成一个初始化密码,而在之前的版本首次登陆不需要登录。(我前面用的是root启动的):
[root@localhost bin]# ./mysqld_safe --user=mysql
2016-04-21T05:24:34.317097Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T05:24:34.463814Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
这帮孙子现在是在抽风么,网上查到这密码放哪儿是一个折腾呐,那最新版本的放哪儿了?
MySQL 5.6 中,mysql_install_db 在数据库创建的时候提供选项来生成 random password。
MySQL 5.7.4 中,可以跳过 -skip-random-password 选项来默认生成随机密码。
MySQL 5.7.5 中,还是默认生成随机密码,但是选项修改为 –insecure
摸索下看:
tail日志时发现,mysql-5.7.12最新版本的密码放在error.log里面了,我去:
[root@localhost bin]# ./mysqld_safe --user=mysql &
[1] 18730
2016-04-21T05:36:56.824891Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.12-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
连接成功,这个新版本的msyql还真TM费劲呐:
[root@localhost ~]# mysql -uroot -p
Enter password: 7EEgNltAA1;/
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12-log
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
强制要求你修改密码:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create database jackTestDB;
Query OK, 1 row affected (0.00 sec)
不要密码初始化数据库的参数,参考自:https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.html
[1] 59478
无密码连接一下看:
[root@localhost bin]# ./mysql -uroot //果然不需要密码就进去了
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12-log Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \q
直接mysql也成:[root@localhost x86_64]# mysql
进入后密码:SET PASSWORD = PASSWORD('123456');
[root@localhost bin]# ./mysql -uroot
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
mysql> SET PASSWORD = PASSWORD('******');
Query OK, 0 rows affected, 1 warning (0.00 sec)
从另一个终端登录看下,不行了,说明直接就修改了,也就是说不用flushprivilege:
[root@localhost bin]# ./mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
首次参考:http://www.bubuko.com/infodetail-1173208.html
1)init database and set password:
[root@localhost bin]#./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
2016-04-21T03:26:22.900370Z 0 [ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
2016-04-21T03:26:22.900452Z 0 [ERROR] Aborting
2)try directly start mysql server display:
[root@localhost bin]# ./mysqld_safe
./mysqld_safe: line 541: /data/mysql/mysqld_safe.pid: No such file or directory
awk: (FILENAME=- FNR=1) warning: error writing standard output (Broken pipe)
2016-04-21T03:26:28.773480Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T03:26:28.814486Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
2016-04-21T03:26:28.957913Z mysqld_safe mysqld from pid file /data/mysql/mysql.pid ended
so,tail -f ,tail -f /data/logs/mysql/error.log
乍一看,是字符编码问题,着实在my.cnf配置文件上面设置了字符编码如下:
再启动,出现新的报错:
可能是目录的权限问题,继续在rpmbuild里写上权限....
chmod -R mysql.mysql /data/logs/mysql /data/mysql
[root@localhost bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
[root@localhost bin]#
日志跟踪,敬告没有Error:
2016-04-21T03:45:21.971611Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971676Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971712Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971745Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.972041Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
立即启动mysqld_safe:
[root@localhost bin]# ./mysqld_safe
2016-04-21T03:47:08.025776Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T03:47:08.075873Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
tail -f /data/logs/mysql/error.log 端口成功启动:
2016-04-21T03:47:08.542210Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.12-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
[root@localhost bin]# ./mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
重新初始化mysql用户名及密码:
[root@localhost bin]# ./bin/mysql_install_db --basedir=. --datadir=/data/mysql --user=mysql
2016-04-21 13:18:24 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-04-21 13:18:24 [ERROR] The data directory needs to be specified.
之前版本mysql_install_db是在mysql_basedir/script下,5.7放在了mysql_install_db/bin目录下,且已被废弃。
shell>./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
******mysql5.7会生成一个初始化密码,而在之前的版本首次登陆不需要登录。(我前面用的是root启动的):
[root@localhost bin]# ./mysqld_safe --user=mysql
2016-04-21T05:24:34.317097Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T05:24:34.463814Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
这帮孙子现在是在抽风么,网上查到这密码放哪儿是一个折腾呐,那最新版本的放哪儿了?
MySQL 5.6 中,mysql_install_db 在数据库创建的时候提供选项来生成 random password。
MySQL 5.7.4 中,可以跳过 -skip-random-password 选项来默认生成随机密码。
MySQL 5.7.5 中,还是默认生成随机密码,但是选项修改为 –insecure
摸索下看:
tail日志时发现,mysql-5.7.12最新版本的密码放在error.log里面了,我去:
[root@localhost bin]# ./mysqld_safe --user=mysql &
[1] 18730
2016-04-21T05:36:56.824891Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.12-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
连接成功,这个新版本的msyql还真TM费劲呐:
[root@localhost ~]# mysql -uroot -p
Enter password: 7EEgNltAA1;/
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12-log
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
强制要求你修改密码:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create database jackTestDB;
Query OK, 1 row affected (0.00 sec)
不要密码初始化数据库的参数,参考自:https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.html
[1] 59478
无密码连接一下看:
[root@localhost bin]# ./mysql -uroot //果然不需要密码就进去了
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12-log Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \q
直接mysql也成:[root@localhost x86_64]# mysql
进入后密码:SET PASSWORD = PASSWORD('123456');
[root@localhost bin]# ./mysql -uroot
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
mysql> SET PASSWORD = PASSWORD('******');
Query OK, 0 rows affected, 1 warning (0.00 sec)
从另一个终端登录看下,不行了,说明直接就修改了,也就是说不用flushprivilege:
[root@localhost bin]# ./mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
首次参考:http://www.bubuko.com/infodetail-1173208.html
[实践OK]scp某个非root非目录用户的新加用户想拷贝某个用户下的文件出现权限不够时怎么办?
Unix/LinuxC技术 jackxiang 2016-4-20 17:38
背景:我想从一台远程机器上的一个用户上的文件拷贝到我的机器上来,可我不想用root拷贝,想新增加一个用户来拷贝,如何实现无 Permission denied,拷贝过来呢?
现象:权限不够,(如下:test这个目录是我加的一个test用户生成的)
/home/test/rpmbuild/RPMS/x86_64 这个我想scp下面的rpm包,我不是root,怎么样能实现拷贝?
[root@localhost x86_64]# scp rpm@192.168.101.***:/home/test/rpmbuild/RPMS/x86_64/mysql-5.7.12-160420134244.el6.x86_64.rpm /data/www/yum/centos/6/x86_64
rpm@192.168.101.227's password: Permission denied
问题:test是我建立的一个test用户。假如test用户的密码我忘记了(我用root修改了下test的密码,再用test用户拷贝没有问题,正常),但我有root。
试图:我还是想用rpm这个专有用户来拷贝。
权限:
[root@localhost ~]# ls -l /home/ |grep test
drwx------. 3 test test 4096 Mar 18 19:18 test
rpm用户进不了这个目录
办法: rpm的用户组改成 test
id test
uid=539(test) gid=539(test) groups=539(test)
xiangjiwu - IEG(33757) 17:11:42
usermod -G test,rpm rpm
rpm的用户组改成 test,实践如下:
[root@localhost x86_64]# id test
uid=539(test) gid=539(test) groups=539(test)
[root@localhost x86_64]# usermod -G test,rpm rpm
[root@localhost x86_64]# id rpm
uid=540(rpm) gid=540(rpm) groups=540(rpm),539(test)
不做下面的权限,也是一样会报权限错误的: Permission denied
chown -R test:rpm /home/test //给test目录递归上rpm组,下面这一步也不可缺少。
chmod -R 750 /home/test //用户7,属组5(4+1),读取+执行。
修改后权限如下:
[root@localhost x86_64]# ls -l /home/ |grep test
drwxr-x---. 3 test rpm 4096 Mar 18 19:18 test
再拷贝,也就成功了:
总结:三个步骤实现,一个不能少,一个是入组,一个是给目录加上组的可读权限:
最后,感谢PHPers@南极里的xiangjiwu - IEG兄弟,Thanks~
斧正:
xiangjiwu - IEG(337**) 17:41:32
rpm用户加到test组了, 那 /home/test就不用改组,直接chmod -R 750 /home/test 就行了。
现象:权限不够,(如下:test这个目录是我加的一个test用户生成的)
/home/test/rpmbuild/RPMS/x86_64 这个我想scp下面的rpm包,我不是root,怎么样能实现拷贝?
[root@localhost x86_64]# scp rpm@192.168.101.***:/home/test/rpmbuild/RPMS/x86_64/mysql-5.7.12-160420134244.el6.x86_64.rpm /data/www/yum/centos/6/x86_64
rpm@192.168.101.227's password: Permission denied
问题:test是我建立的一个test用户。假如test用户的密码我忘记了(我用root修改了下test的密码,再用test用户拷贝没有问题,正常),但我有root。
试图:我还是想用rpm这个专有用户来拷贝。
权限:
[root@localhost ~]# ls -l /home/ |grep test
drwx------. 3 test test 4096 Mar 18 19:18 test
rpm用户进不了这个目录
办法: rpm的用户组改成 test
id test
uid=539(test) gid=539(test) groups=539(test)
xiangjiwu - IEG(33757) 17:11:42
usermod -G test,rpm rpm
rpm的用户组改成 test,实践如下:
[root@localhost x86_64]# id test
uid=539(test) gid=539(test) groups=539(test)
[root@localhost x86_64]# usermod -G test,rpm rpm
[root@localhost x86_64]# id rpm
uid=540(rpm) gid=540(rpm) groups=540(rpm),539(test)
不做下面的权限,也是一样会报权限错误的: Permission denied
chown -R test:rpm /home/test //给test目录递归上rpm组,下面这一步也不可缺少。
chmod -R 750 /home/test //用户7,属组5(4+1),读取+执行。
修改后权限如下:
[root@localhost x86_64]# ls -l /home/ |grep test
drwxr-x---. 3 test rpm 4096 Mar 18 19:18 test
再拷贝,也就成功了:
总结:三个步骤实现,一个不能少,一个是入组,一个是给目录加上组的可读权限:
最后,感谢PHPers@南极里的xiangjiwu - IEG兄弟,Thanks~
斧正:
xiangjiwu - IEG(337**) 17:41:32
rpm用户加到test组了, 那 /home/test就不用改组,直接chmod -R 750 /home/test 就行了。
Zephir--最简单的php扩展开发工具
Php/Js/Shell/Go jackxiang 2016-4-18 14:32
背景:写PHP扩展很麻烦,有用c写也有用c++写都麻烦,且难调错,有没有没一个框架实现,从框架看也就是输入和输出,以字符串char*传入,json输出,就很简单了,这儿介绍一个:Zephir提供了一种类似php的高级语言语法的方式,来自动生成扩展的c语言代码,使编写php扩展变得非常的简单。
阅读全文
阅读全文
Unix域套接字,UNIX域套接字实例。
Unix/LinuxC技术 jackxiang 2016-4-18 14:17
背景:像unix或linux下的mysql和php-fpm都有一个xxx.sock文件,它是干嘛的呢?可以研究一下它。
管道由于只能实现具有亲缘进程的进程间通信,使用受到了很大的限制,命名管道解决了这一问题。但是,无论是管道还是命名管道,都只能实现单向通信(在只创建一个管道的情况下)。
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。这里所指的使用套接字实现进程间通信,是由将通信域指定为PF_UNIX来实现的。该函数的形式如下:
int socket(int domain, int type, int protocol);
socket函数中的domain参数用于指定通信域,domain参数取PF_UNIX时,表示创建UNIX域的套接字。使用PF_UNIX域的套接字可以实现同一机器上的不同进程间的通信。
调用bind函数实现了套接字与地址(这里是文件名)的绑定。bind函数的具体信息如下:
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
其参数my_addr为指向结构体sockaddr_un的指针,该结构体的定义如下:
#define UNIX_PATH_MAX 108
struct sockaddr_un {
sa_family_t sun_family; /*PF_UNIX或AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* 路径名 */
};
在该结构体中,sun_family为AF_UNIX。sun_path是套接字在文件系统中的路径名。
Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。
Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。
server.c
send.c
gcc server.c -o server
gcc send.c -o send
[root@iZ25dcp92ckZ sock]# ./server
Bind is ok
有client启动后server响应如下:
Recv: Counter is 1
Recv: Counter is 2
Recv: Counter is 3
Recv: Counter is 4
[root@iZ25dcp92ckZ sock]# ./send
Send: Counter is 1
Send: Counter is 2
Send: Counter is 3
Send: Counter is 4
最后,还发现那个设备文件server.sock 不能直接cat去读取,只能stat:
[root@iZ25dcp92ckZ sock]# cat server.sock
cat: server.sock: 没有那个设备或地址
[root@iZ25dcp92ckZ sock]# stat server.sock
文件:"server.sock"
大小:0 块:0 IO 块:4096 套接字
设备:ca01h/51713d Inode:16282 硬链接:1
权限:(0755/srwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2016-04-18 14:11:20.878641353 +0800
最近更改:2016-04-18 14:11:20.878641353 +0800
最近改动:2016-04-18 14:11:20.878641353 +0800
创建时间:-
实践摘录自:http://www.cnblogs.com/hnrainll/archive/2011/12/03/2274973.html
管道由于只能实现具有亲缘进程的进程间通信,使用受到了很大的限制,命名管道解决了这一问题。但是,无论是管道还是命名管道,都只能实现单向通信(在只创建一个管道的情况下)。
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。这里所指的使用套接字实现进程间通信,是由将通信域指定为PF_UNIX来实现的。该函数的形式如下:
int socket(int domain, int type, int protocol);
socket函数中的domain参数用于指定通信域,domain参数取PF_UNIX时,表示创建UNIX域的套接字。使用PF_UNIX域的套接字可以实现同一机器上的不同进程间的通信。
调用bind函数实现了套接字与地址(这里是文件名)的绑定。bind函数的具体信息如下:
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
其参数my_addr为指向结构体sockaddr_un的指针,该结构体的定义如下:
#define UNIX_PATH_MAX 108
struct sockaddr_un {
sa_family_t sun_family; /*PF_UNIX或AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* 路径名 */
};
在该结构体中,sun_family为AF_UNIX。sun_path是套接字在文件系统中的路径名。
Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。
Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。
server.c
send.c
gcc server.c -o server
gcc send.c -o send
[root@iZ25dcp92ckZ sock]# ./server
Bind is ok
有client启动后server响应如下:
Recv: Counter is 1
Recv: Counter is 2
Recv: Counter is 3
Recv: Counter is 4
[root@iZ25dcp92ckZ sock]# ./send
Send: Counter is 1
Send: Counter is 2
Send: Counter is 3
Send: Counter is 4
最后,还发现那个设备文件server.sock 不能直接cat去读取,只能stat:
[root@iZ25dcp92ckZ sock]# cat server.sock
cat: server.sock: 没有那个设备或地址
[root@iZ25dcp92ckZ sock]# stat server.sock
文件:"server.sock"
大小:0 块:0 IO 块:4096 套接字
设备:ca01h/51713d Inode:16282 硬链接:1
权限:(0755/srwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2016-04-18 14:11:20.878641353 +0800
最近更改:2016-04-18 14:11:20.878641353 +0800
最近改动:2016-04-18 14:11:20.878641353 +0800
创建时间:-
实践摘录自:http://www.cnblogs.com/hnrainll/archive/2011/12/03/2274973.html