陸 一鳴<lu.yiming@outlook.com>  下午 04:11:38
https://gist.github.com/luxixing/7411156
PHP5.3向更高版本迁移的内容基本写完了
感兴趣的看看,有不足之处请在下面的评论反馈,
我会尽量完善
有些内容如果需要优化示例或者新增示例的话也反馈下

https://gist.github.com/luxixing/7411156
背景:多个项目进行代码的日志打印级别统一替换时,如果文件庞大,数目多,一个个去做显然力不从心,得通过脚本,这种替换sed最适合不过了。

paste imgid.txt times.txt |awk -F"." '{print $1}'|awk -F'T' '{print $1"        "$2}'|sed "s/[-:]//g"| paste imgid.txt times.txt |awk -F"." '{print $1}'|awk -F'T' '{print $1"        "$2}'|sed "s/[-]//g;s/://g"

[28-Jan-2019 20:22:33 Asia/Shanghai] PHP Warning:  Redis::connect(): connect() failed: Cannot assign requested address in /root/a.php on line 6
[28-Jan-2019 20:22:33 Asia/Shanghai] PHP Fatal error:  Uncaught RedisException: Redis server went away in /root/a.php:7
Stack trace:
CentOS6和7都要打开,模糊替换:

linux地址重用 net.ipv4.tcp_tw_reuse:
https://blog.csdn.net/pzqingchong/article/details/53580732

sed实现去注释,加中间小横:
#BuildRequires: %{_php_fpm}%{php_version}                                                                                                                    
#Requires: %{_php_fpm}%{php_version}



fpm}%{php  ==替换成=> fpm}-%{php:


如题:
I:
我想把:log_threshold =N;
替换为:log_threshold =1;

我想把:show_debug_errors=AnyWord;
替换为:show_debug_errors=false;

II:
error_reporting(E_ALL ^ E_NOTICE); 变:
//error_reporting(E_ALL ^ E_NOTICE);

I):日志开关,错误级别修改:
一、Sed替换方法如下(该处由scottjiang兄弟提供,后面我发挥了一下下:-)):


二、如果不想备份直接替换:


三、多个项目的index.php都要统一用sed替换:



II):sed实现对PHP代码某特征给注释一行(如:项目上线时不想让其打开错误报告给用户):
如想:
error_reporting(E_ALL ^ E_NOTICE); 变:
//error_reporting(E_ALL ^ E_NOTICE);
sed替换方法:

而:也可结合上面三实现批量替换实现多个文件包含上面串的该行给予注释掉:


四、替换由mysqldump出的自境长字段为0:
情形:Mysqldump出的线下自增长字段,会有默认值,而放到外网则需要从线上开始,此SQL也需要替换的(http://jackxiang.com/post/1188/)
deo` VALUES (1121,NULL,'
用sed替换:
sed -i "s/([0-9]*/(0/g" /tmp/result.sql  
替换后,为0,上线插入时则从线上默认增长,而不是上面的1121:
_video` VALUES (0,NULL,'2'

sed -i 's/([0-9]*,/(0,/g'   //文件名替换(12122, ==>(0,
背景:处理网站访问时后面才进行写日志,常看到类似的类里在单例中这样使,好多都是说类中,而没有谈到类中是单例的使用方法,如下:


简单实践:


运行情况:
---------- 调试PHP ----------
注册完shutdown函数
做数据链接,写入日志内容但不写在shutdown:clean_exit时写。
干完所有事情了,立即退出
clean_exit时写在web运行完后在这儿做写日志等的操作,单例模式注册日志先放前面数组,后面在这儿写。
输出完成 (耗时 0 秒) - 正常终止
阅读全文
这个是同事写的,在这里备注一下:
背景:线上用unix socket线下测试用tcp 9000,配置一样上线会出问题的。再就是这两种的区别。
两种不同配置会在Nginx上反映出来的:
125 connect() to unix:/usr/local/php/var/run/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.136.1, server: mytv.xiyou.cntv.cn, request:

    在你fpm启动脚本php-fpm.conf里配置,在php-fpm.cnf里设置,AF_UNIX稳定性比TCP要高多了,unix socket或者TCP,unix socket的好处是性能更好,一个是AF_UNIX,本地管道,只能本机用一个AF_INET,通过网卡通讯,听说unix不如inet稳定?一个是AF_UNIX,本地管道,只能本机用一个AF_INET,通过网卡通讯。nginx如果打算和fpm在同一台机器,那就用unix sock
如果想分开部署,可以用TCP
基本还是tcp吧
这年头,哪还有一台机器什么都干的事
unix socket是一个环形内存buffer,内核保证顺序
淘宝这里前端接入层是LVS,RS就是nginx + php-fpm,它们之间使用unix sock通信,每台机器都配置一个nginx+php。
回忆未来-向东-Jàck()  下午 03:08:27
不同在:
listen = 127.0.0.1:9000
listen = /usr/local/php/var/run/php-fpm.sock
Nginx在配置上也就不同了:
fastcgi_pass  127.0.0.1:9000;  
fastcgi_index index.php;
include fcgi.conf;

fastcgi_pass  unix:/usr/local/php/var/run/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;

阅读全文
背景:外包水平太差了,上传图片裁剪,先放服务器,再读取裁剪,我记得可以在用户本地裁剪的,这块都写成那样了,就那样吧,这块设计到图片显示,因支持多个域名和部署问题这块还得直接显示,PHP直接显示图片,用浏览器访问是不可能的,要用SRC:<img src="http://jackxiang.com/logo/getpic?filename=201310262031159804.png&amp;rand=1382790675000">。
PHP读取图像文件并在浏览器上显示
去年做过一个项目,要把用户上传的图像文件用PHP读取图像文件并列出文字清单,当用户点击一个文件名后,就可以显示这个图像.

因为要考虑兼容各种不同的图像格式, 我使用了GD库, 判断出具体是那种图像文件(MINE),再调用相应的image生成函数imagecreatefromXXX(),生成一个img,再将这个img以jpeg格式输出至浏览器,虽然做出来了,但总觉得不满意.

今天有机会重新考虑这个功能,在php手册中发现几行代码,简洁明快,完全能实现我要的功能,还不需要GD库

代码如下:

$size = getimagesize($filename); //获取mime信息
$fp=fopen($filename, "rb"); //二进制方式打开文件
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp); // 输出至浏览器
exit;
} else {
// error
}
?>

代码量是我原来的1/10都不到,速度快了N倍.
外包说三年经验,这个没调出来,我看未必啊,
给他下面的参考代码都给弄错了,我调通了下,他继续:

来处:http://www.shangxueba.com/jingyan/122754.html
其实就是一个ps进程探测,
后面写一个分析
文件先贴出来。
Monitor.sh代码


Init.xml代码:


来自:http://cocos.iteye.com/blog/1063333
背景:近来有一个需求也就是让外包做一个类新浪微博里的短域名功能,而外包给出说是js跳转的,用的是alt里的属性值实现的,让我想起当年我在新浪微博时,正好让一兄弟去做这个短域名的事情,后来就离开了新浪微博,于是有这事儿就了解下呗,其实现方式上有与外包所述有较大出入。
在微博里找个短的Url示例链接如下:http://t.cn/zRM2bLm ,直接贴上google的chrome浏览器里并分析其Http协议头:
请求头和返回如下:
一)Google的Chrome发起请求:
HTTP/1.0 302 Moved Temporarily
Request URL:http://t.cn/zRM2bLm
Request Method:GET
Status Code:302 Moved Temporarily
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Host:t.cn
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1530.2 Safari/537.36

二)服务端返回Location的Url:
Response Headersview source
Age:0
Connection:Keep-Alive
Content-Length:224
Content-Type:text/html;charset=UTF-8
Date:Mon, 21 Oct 2013 02:34:02 GMT
Location:http://www.iheima.com/archives/54668.html
NetAnts:MaxConnection=1
Proxy-Connection:Keep-Alive
Server:weibo
Via:1.1 varnish
X-Varnish:3008712889

三)HTML给用户的展现(一瞬间就过去了,浏览器直接重新定向,几乎看不到的):


这块要快,其实现有可能是通过key=value格式的,如nginx直接代码到某些no-sql存储里实现的才能实现较大并发,
当然对这些url可以实现hash到多台服务器即可实现横向扩展。
这个哥们的redis值得借鉴:http://zjcjack.blog.163.com/blog/static/20283218020130319363715/
背景:在线上代码和线下代码不一致时,用这个时间先比对是很重要的,首先看时间确定是不是最新的代码,再进行问题排查是很有必要的。再就是线上代码的调试,要注意其函数和调用层次位置,一定要区分开线下最新代码区分看(线下有zend 等跳转有可能心里觉得线下是最好的样板,而给调试带来不便。),主要是通过版本号来判定线上是否已经更新上去了。
实践OK如下:
只需要对svnClient安装后,选中目录或文件点右键,TortoiseSVN-> properties->New...->Keywords,选中:ID即可:
* @version    $Id: imageinfo.php 230 2014-10-10 07:33:10Z xiangdong $
提交后自己就给变成自己的当前文件,日期及版本号。
—————————————更多参数———————————————————————————————————————————
Subversion 的 svn:keywords 是一个非常有用的功能,可以让你将发生在源代码中的一些属性的变化自动地更新到源代码中。
所有php的开头都要加上
/**
* @version    $Id: activitymodule.php 1571 2013-10-08 07:02:15Z yu****chun $
*/
选中目录或文件点右键,TortoiseSVN-> properties->New...->Keywords,先中:Author,Date,ID,Revision,URL.选后就算是打上标就可以了。每次递交就会自动更新,TortoiseSVN-> properties->New...->Advanced里可自己写。

常用.h .cpp文件头
/**
  @(#)$Id$
  @brief     Multi-threaded programming critical section (lock)
  @Author $Author$
  @Date $Date$
  @Revision $Revision$
  @URL $URL$
  @Header $Header$
*/
附加:
  $Id$
  $Author$
  $lastChangedBy$
  $lastChangedDate$
  $Date$$Revision$
  $URL$
  $Header$

一般搞这种的都是从cvs时代过来时就搞这个keyword,现转向svn了svn也和cvs一样支持keyword,而且用法也一样。


SVN使用详解之如何设置svn:keywords :
Subversion 中可以使用的 Keyword 包括下面这些。
Id
这是一种综合的格式,例如“$Id: V2EXCore.php 4 2005-10-29 23:08:09Z livid $”。
LastChangedDate
最后被修改的时间,这个属性也可以缩写为 Date。
LastChangedBy
最后修改该源代码文件的用户名,这个属性也可以被缩写为 Author。
LastChangedRevision
最后修订的版本号,这个属性也可以被缩写为 Revision 或者 Rev。
HeadURL
该源代码文件所位于的 Repository 上的绝对 URL 地址,这个属性也可以被缩写为 URL。
使用命令行设置:
先CD到你的工作目录(对于工作目录在二楼有解释,简而言之就是你用于暂时存放Subversion中为本库的一个Copy的目录,
如果你安装了TortoiseSVN工作目录上是带个小图标的,更新了文件没有更新是一个叹号,更新后有一个绿色的勾)
E:\MakeWeb\www.zxlm.cn\blogdevelopment\admin>svn propset svn:keywords "LastChangedDate Author" *.php
属性“svn:keywords”设定于“admincp.php”
属性“svn:keywords”设定于“adminfunctions.php”
属性“svn:keywords”设定于“article.php”
属性“svn:keywords”设定于“attachment.php”
属性“svn:keywords”设定于“cache.php”
属性“svn:keywords”设定于“category.php”
如果提示  svn: “.”不是工作拷贝
说明你不在工作目录下执行些命令.
CD到工作目录即可.
对于每个项目的工作目录都需要单独设置.
如果提示  svn: 本客户端已过时,无法存取工作拷贝
那么你就得检查一下你的SVN的客户端和SVN服务器的版本是不是一致了,看这里了解详细.
最好两者都使用最新的版本.
使用TortoiseSVN设置svn:keywords
在你的工作目录中需要设置的文件上右键:选择属性.
然后出来一个这样的对应框:
在属性中选中 svn:keywords.
在取值中键入需要设置的关键字,所有关键字只能一次全部输入.
再确定.
这样你就设置好了 svn:keywords 了.

引用:
Subversion 的 svn:keywords 是一个非常有用的功能,可以让你将发生在源代码中的一些属性的变化自动地更新到源代码中。
比如你可以在客齐集社区的每一个页面的底部都看到的这样的一行字。
$Id: V2EXCore.php 4 2005-10-29 23:08:09Z livid $这行字的意思是表示,V2EXCore.php 这个源代码文件最后被用户 livid 更新于 2005-10-29 23:08:09Z,修订版本号为 4。要实现这样的自动更新,你只要对需要这样的属性的文件上使用下面这行指令。
svn propset svn:keywords "Id" V2EXCore.php然后在源代码文件中需要 Subversion 进行自动更新的地方插入 $Id$ 这样的 Keyword,那么在你下次进行 svn commit 之后,该 $Id$ 就会被 Subversion 自动替换为 $Id: V2EXCore.php 4 2005-10-29 23:08:09Z livid $ 这样的格式。
Subversion 只会对你明确设置了 Keyword 进行更新,比如如果你对某个源代码文件执行了下面这条指令。
svn propset svn:keywords "Id Date" V2EXCore.php则在 V2EXCore.php 中所有的 $Id$ 和 $Date$ 都会被替换,而 $Author$ 之类的没有被设置的属性则不会发生替换。  

来自:http://blog.cntv.cn/11430895-3106020.html
更多参考:
http://blog.ihipop.info/2011/08/2698.html
http://jdkcn.com/entry/how-to-add-auto-props-in-subversion.html
http://blog.ihipop.info/2011/08/2698.html
http://ad-hoc.blog.sohu.com/107465483.html
直接修改配置文件的方法,时间相差8小时:
http://hi.baidu.com/cyrist/item/97a5e6f12b44b3c4a835a2dc
SVN嵌入属性(获得最后一次提交的人,时间...):
http://blog.csdn.net/lsd123/article/details/3345388
fwrite 和file_put_contents谁更快? LOCK_EX阅读全文
背景:写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签。
实现代码:


来自:http://www.zhangxinxu.com/wordpress/?p=749

摘录:
URL地址自动添加的实现
URL地址自动添加的实现其实就是那么点内容:检测与替换。
检测
“检测”就是检测文字(字符串)内部是否有符合http地址的内容,显然,这需要用到正则表达式进行验证,这个工作前端和后台都可以做,这里,只讲前端的方法,使用JavaScript实现。
验证HTTP地址的正则表达式如下(可能有疏漏或是不准确之处,欢迎指正):
var reg = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|&|-)+)/g;
前一部分匹配http或是https开头的URL字符串地址,后面一部分匹配一些字符,英文字符、下划线(_)、点号(.)、问号(?)以及等号(=),连接短线(-)等。
替换
说到JavaScript中的替换功能,首先想到的自然是replace属性了,replace属性强大之处在于其支持正则表达式,可以对符合正则的字符串进行替换。例如,我们要替换掉字符串两端的空格就可以使用类似下面的语句:
var s = " blank ";
s = s.replace(/^\s+(.*?)\s+$/, "");
alert(s);
怎么禁止浏览器自动保存密码?
背景:有时不是记住密码就方便,有时是记录了反而不好,不安全呵。
1)首先大部分浏览器都是根据表单域的type="password"来判断密码域的,所以针对这种情况可以采取“动态设置密码域”的方法:
<input type="text" name="password" onfocus="this.type='password'" />
IE下不支持修改input 的type属性,会报错!

可以用两个input 一个是text 另一个是password之间的显示与隐藏来实现 这个功能
解释:当这个文档框获取焦点时才将其变成密码域,这样浏览器就不会记住密码,当然为了更加完善,还可以把autocomplete="off"属性也加上。
2)autocomplete="off"
3)在onload事件,把密码框的值清空,即:
<script language="javascript">
<script language="javascript">
window.load = function(){
    document.getElementById('login_pwd').value='';
};
</script>
[/codes]
4)页面采用https协议,因为https是不会对表单进行保存信息的。
5)针对有些浏览器插件的自动填表功能
这个就比较麻烦了,我想这种情况应该是插件记住表单域name的值,然后再进行填表,这种情况,我觉得可以在页面加载时动态更改name的值,当提交表单的时候再把表单的值组合成正确的对应值再提交。这个没有经过验证,只是我个人的想法。你可以试试
如果以上这些方法还满足不了你,那我也没办法了。

建议:
试一下把对应域名下的cookie清掉,浏览器应该是根据cookie来记住用户名密码的。
(不是的,有的浏览器是在你提交表单后,根据你提交的值来记住的)
(对的 有些浏览器不记录在COOKIE 这个比较头疼 顺便问下INPUT里输入过的值如何清除?我希望能像银行的那样 输入过的值不再出现)
浏览器记住密码的实现方式就是通过寻找type为password的input输入框,然后前边一个输入框就作为用户名记住。所以解决这个问题的办法就是在用户名input和密码input之间增加一个type为text的输入框设置css属性display为none。
来自:http://www.jb51.net/article/35878.htm

采用办法:
(1)
密码:<input type=\"text\" name=\"login_pwd\" id=\"login_pwd\" class=\"mytxt\"  size=\"12\" onfocus=\"this.type='password'\" autocomplete=\"off\"/>
(2)
linux下shell终端curl的post数据
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "http://post.html"  -d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票" http://post.php
注释:
-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
的意思就是申明客户端是windows2000下的ie6的浏览器;
-e "http://post.html"的意思就是refer是这个页面;
-d后面的参数都是将用post方式提交到服务器去的
最后面的就是将要post到的url地址
这里提到了-A、-e和-d参数,
其实用的比较多的还有
-x(后面用ip:port方式接代理服务器)等等,
这里就不一一列举了,可以参考man curl

demo
curl $URL -d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票"

结果
Array
(
    [2880] => Array
        (
            [0] => 105
        )

    [pid] => 2880
    [p] => 最佳
    [count] => 1
    [receipt] => 1
    [poll] => 投票
)

4.模拟指定浏览器

有些变态的站点,限制了使用浏览器的类型.一样难不倒curl.

curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” [URL]
这个就是一个模拟,win2k的ie5.0的一个访问.

阅读全文
本文纯粹是贴出一些比较实用的代码出来供大家学习和使用,也算是个人博客对这些实用代码的记录和收集吧!有用到的可以参考,没用到的直接可以飘过!

特意将这些代码写成jQuery插件的格式,这样方便大家使用的时候调用。我在平时的开发和自我学习过程中也积累了不少有用的代码,不知道怎么概括性地发布出来,所以就已文章的形式陆续贴出来与大家分享。

以单篇文章发布的插件代码都是一些简单的代码,若是一些复杂的代码或插件我会归纳到插件专区里去,这样大家下载起来也方便!

一、插件代码


注意其中调用方法中的timerArr变量,若你在前面调用代码显示了效果,在页面的后面代码中需要清楚该闪烁效果的话,需要注意timerArr变量的作用域。若只是出现效果而无需清楚,则可以直接调用$.hiro.blinkNews.show()
二、调用方法

来自:http://www.ihiro.org/javascript-news-flash-header-tips
这个破问题调了一下午,火狐没问题,在网上搜了下发现是ie 下innerHTML的优先级不够,不能给td、tr、p之类的加innerHTML要改成span、div之类的。按正常问题应该就解决了,但是我这个页面用几个页面拼到一起,还是不好用。之后把form去掉又好用了,以为是form的问题。
但最好调来调去还是页面的问题,引的其它页面里面代码不完整。比如<td>有开始没有结束之类的,或者其它页面引的js有问题。
最后把其它页面的代码修改了下就好用了。。。。。

总结如下
要实现的功能需要在ajax输出的页面结构中再次使用ajax输出新的内容,如果把所有ajax输出区域放在静态页面,可以实现;但是,改成在动态页面区域中再重新定义动态区域输出时,IE就报出“未知的运行时错误”,查找相关资料,做的尝试如下:

1.检查尝试加到innerHTML的html代码是否包含破损的html标签,没有发现此类错误;
2.把容器改成那些比较“包容”的标签,已将容器改成div和span;
3.将容器标签放在form外面,已做修改;

来自:http://blog.sina.com.cn/s/blog_4586764e0100ktb7.html


curl如果需要进行毫秒超时,需要增加:
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);  
或者是:
curl_setopt ( $ch,  CURLOPT_NOSIGNAL, true); 是可以支持毫秒级别超时设置的
[codes=php]
<?php  
if (!isset($_GET['foo'])) {  
        // Client  
        $ch = curl_init('http://example.com/');  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);    //注意,毫秒超时一定要设置这个  
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用  
        $data = curl_exec($ch);  
        $curl_errno = curl_errno($ch);  
        $curl_error = curl_error($ch);  
        curl_close($ch);  
        if ($curl_errno > 0) {  
                echo "cURL Error ($curl_errno): $curl_error\n";  
        } else {  
                echo "Data received: $data\n";  
        }  
} else {  
        // Server  
        sleep(10);  
        echo "Done.";  
}  
?>  
[/code]

来自:http://developer.51cto.com/art/201208/351996_2.htm

curl的超时时间 :
今天在一台服务器上突然看到一个curl进程已经运行了28天还木结束, 有点奇怪! 我在使用curl的时候也设置了超时时间, --connect-timeout 5
curl --connect-timeout 5 --data-binary "set=${L_UPLOAD_DATA_ENCODED}" http://172.88.99.00:8080/xxx.php &>/dev/null
按理来说, 应该是5s就会超时退出了!  纳闷之余想起wget好像对超时时间, 是有分阶段的, 比如说请求的超时, 传输的超时等等, 所以就仔细查看了下curl的手册页:
原来使用curl时,有两个超时时间:一个是连接超时时间,另一个是整个过程允许的最大时间,
--connect-timeout <seconds>
    Maximum time in seconds that you allow the connection to the server to take.  This only limits the connection phase, once curl has connected this option is of no more use. See also the -m/--max-time option.
    If this option is used several times, the last one will be used.
这个是指定连接超时时间。 如果出错, 提示形如:curl: (28) connect() timed out!

-m/--max-time <seconds>
    Maximum  time  in seconds that you allow the whole operation to take.  This is useful for preventing your batch jobs from hanging for hours due to slow networks or links going down.  See also the --connect-timeout option.
    If this option is used several times, the last one will be used.
这个是指定最大的允许时间。 出错提示如:curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received


还可以这样用: curl -o x.log "http://www.yyyy.com" --speed-time 5 --speed-limit 1
是说将url内容保存到x.log中, 如果传输速度小于1字节/秒的状态持续5秒,该连接就会终止.
来自:http://blog.chinaunix.net/uid-20788470-id-1841681.html
分页: 13/26 第一页 上页 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 下页 最后页 [ 显示模式: 摘要 | 列表 ]