在某个项目中需要分析 PHP 代码,分离出对应的函数调用(以及源代码对应的位置)。固然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑,这都不是最优的方式。

查询了 PHP 手册,发现实在 PHP 已经内置解析器的接口,那就是 PHP Tokenizer,这工具正是我想要的。使用 PHP Tokenizer 能简单、高效、正确的分析出 PHP 源代码的组成。

实例:



---------- 调试PHP ----------
1 - T_OPEN_TAG  <?php
1 - T_ECHO  echo
1 - T_WHITESPACE  
1 - T_CONSTANT_ENCAPSED_STRING  "string1"
1 - T_CONSTANT_ENCAPSED_STRING  "string2"
1 - T_WHITESPACE  
1 - T_CLOSE_TAG  ?>

输出完成 (耗时 0 秒) - 正常终止

参考:http://php.mirror.camelnetwork.com/manual/zh/ref.tokenizer.php
Download:
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
configure and make :

实践Ok如下:
能到到Get的配置: upload_pass     /up.php?$args;     ,并重新启动Nginx即可。
阅读全文
问题描述:
在wordpress后台编辑文章,上传图片的时候出现“无法建立目录 是否上级目录没有写权限?”错误。
还有个提示说:
无法建立目录E:\wwwroot\****\web/wp-content/uploads是否上级目录没有写权限?查阅了一些wordpress的解决方法都没有解决问题,只到看到某个博客上写着改键值的方法。于是试了一下,问题得到了解决。

方法:
使用PHPMyAdmin进入数据库。数据库管理的高级管理可以进去。
找到wordpress数据库,打开wp_options表
修改表中键名为upload_path的键值 这个值是一个路径(可能在表的第二页)
将类似“/home/****/web/wp-content/uploads”直接改成“wp-content/uploads”就解决了。注意:只是去掉了一个“/”而已。


WordPress 默认的上传目录位于 wp-content/uploads ,并且根据设置还可以按照年月归档。可是,如果我要上传一个头像,或者幻灯片的话,也跟附件混在一起总是不太好吧?幸好 WordPress 知道会有用户有这种需求,我们可以通过 filter 来临时改变文件上传目录。filter 函数如下:


function slider_upload_dir($uploads) {
    $siteurl = get_option( 'siteurl' );
    $uploads['path'] = WP_CONTENT_DIR . '/slider';
    $uploads['url'] = $siteurl . '/wp-content/slider';
    $uploads['subdir'] = '';
    $uploads['basedir'] = $uploads['path'];
    $uploads['baseurl'] = $uploads['url'];
    $uploads['error'] = false;
    return $uploads;
}
在 WordPress 处理上传文件之前,加载这个 filter 函数:

add_filter('upload_dir', 'slider_upload_dir');
这样上传的文件将会上传到 wp-content/slider 目录!这个方法特别适合于有上传头像或者幻灯片需求的项目,可以避免这些文件和文章附件混淆。

来自:www.codecto.com/2012/04/wordpress-handle-upload-path/
背景:在一些做唯一值时,有些视频网站用UUID来做视频的唯一值,所以这个是怎么保持不重复的哩?
阅读全文
目录情况:里面的php文件都在下面
root@192.168.136.128:~/software/xhprof-0.9.2# ls
CHANGELOG  CREDITS  examples  extension  LICENSE  README  xhprof_html  xhprof_lib
文件来源:把上面的文件都放在/data0/htdocs/tools.jackxiang.com/xhprof/下
Host:192.168.136.128  tools.jackxiang.com
htdocs:/data0/htdocs/tools.jackxiang.com
访问地址:
http://tools.jackxiang.com/xhprof/xhprof_html/index.php?run=528c8c8a00e2b&source=hx
程序编写:

访问:http://tools.jackxiang.com/index.php



背景:以前用xdebug,现在听群里说有这么个玩意,是轻量级的,于是找了下,说是这xhprof比xdebug提示更明显,前面有一篇文章说过,我在此也再作下备注。
有人说自从xhprof出来之后分析PHP性能方便多了
以前都是自己写Trace工具,手工打点,记录 trace信息:
http://www.yiibase.com/php/view/180.html

作者:老王
调试PHP时,XDebug一直是大众的不二选择,搭配上Webgrind,可以获得不错的效果。今天看某人的栖息地里的介绍,才发现了XHProf,于是体验了一下,感觉很酷,与XDebug相比,运行更轻便,表现更易懂,下面记录一下体验过程。

安装XHProf:
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cp -r xhprof_html xhprof_lib <directory_for_htdocs>
cd extension
phpize
./configure
make
make install

编辑php.ini:
[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=<directory_for_storing_xhprof_runs>

重启服务让修改生效,现在就可以使用XHProf了,不过为了显示效果更炫,最好继续安装Graphviz。
安装Graphviz:
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install

安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。
使用XHProf:
// start profiling
xhprof_enable();

// run program
....

// stop profiler
$xhprof_data = xhprof_disable();

//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";

如此一来,会在上面设定的xhprof.output_dir目录里生成名字类似49bafaa3a3f66.xhprof_foo的数据文件,可以很方便的通过Web方式浏览效果:

http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo

目前显示的是表格形式的显示,点击页面上的[View Full Callgraph],就能看到精美的图片显示了。

补充:发现一个名为XLOG:http://tekrat.com/php/xlog/  的扩展,看上去不错,可以记录URL信息。和XDEBUG这样的扩展相比,XLOG更轻便,所以部署在生产服务器上不会对性能造成过大影响。

来源:http://hi.baidu.com/thinkinginlamp/item/6488cd3bc8e0f6be134b14cb

___________________________
简述:XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开 销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序。它独有的数 据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用中每个深度的调用一个有用的命名来避开死循 环。XHProf分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。

环境:CentOS 5.5 x64

安装:
cd /root/tools
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cd extension
/elain/apps/php/bin/phpize
./configure --with-php-config=/elain/apps/php/bin/php-config
make && make install
cd ../../

#2.安装Graphviz
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.28.0.tar.gz
这个能下载:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
目前最新:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz
tar zxf graphviz-2.28.0.tar.gz
cd graphviz-2.28.0
./configure --prefix=/elain/apps/graphviz
make  && make install
cd ..
ln -s /elain/apps/graphviz/bin/* /bin/
安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。
文库:http://wenku.baidu.com/view/d2908ba9d1f34693daef3e84.html


#3.安装libpng
wget http://cdnetworks-kr-2.dl.sourceforge.net/project/libpng/libpng15/1.5.2/libpng-1.5.2.tar.gz
tar zxf libpng-1.5.2.tar.gz
cd libpng-1.5.2
./configure --prefix=/elain/apps/libpng
make && make install
cd ..

编辑php.ini
vi  /elain/apps/php/etc/php.ini

extension = "xhprof.so"

[xhprof]
xhprof.output_dir="/elain/logs/xhprof/log"

重启php即可
来自:http://elain.blog.51cto.com/3339379/632303
有没有打开d盘的快捷键?在进行别的操作的时候,想打开d盘又不想返回桌面:
1)打开我的电脑,直接选中你要的盘符(D盘),用拖拽的到桌面
即可创建快捷方式,
2)右击 D盘的快捷方式 在 属性 中 编辑 快捷键(按个人喜好编辑,如
CTRL+ALT+B,注意不要和其他组合键冲突了 即可)

WIN+E,打开我的电脑,然后你选盘。好像没办法用快捷键直接打开D的哦。
WIN+R,输入:d: 就打开了D盘符。


来自:http://zhidao.baidu.com/question/128238695.html
背景:近来对Nginx的上传模块这一块,Flash上传时进度条都过了,但是那个文件还没有出现,一会儿后才出现那个文件,并慢慢增大,我用的是Nginx的上传插件,这种问题怎么去查?我刚用了strace,我在想它是把上传的东东放在哪儿去了呢?
http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
Rango  上午 11:56:57
用apache来做吧,apache是交给php来处理的,
回忆未来-向东-Jàck  下午 12:01:57
嗯,我再看看,兄弟觉得Apache下的PHP比起Nginx的PHP在上传一块有更高的效率是么?
Rango  下午 12:02:23
都差不多吧
apache比较成熟

=================================================================================
Rango  下午 01:45:42
你看下 man pwrite
回忆未来-向东-Jàck  下午 01:55:19
好看到了,这个PHP上传大文件和Nginx上传大文件,是先接进来放到内存后,在写到文件里吧?
Rango  下午 01:55:30
嗯,是的,都是这样做了
pwrite就是相当于 fseek + fwrite
回忆未来-向东-Jàck  下午 01:56:55
至于内存里放在什么时候开始写,那应该是由nginx程序里的配置来实现的吧?
如果我猜测没错的话
=================================================================================
upload_buffer_size 上传缓冲区大小
upload_max_file_size 指定上传文件最大大小,软限制。client_max_body_size硬限制。
upload_limit_rate 上传限速,如果设置为0则表示不限制。
upload_pass_args 是否转发参数。
=============================================================================


=============================================================================
ack 1460:
第一个报文的TCP头里通过MSS这个可选项告知对方本端能够接收的最大报文(当然,这个大小是TCP净荷的大小),以太网上这个值一般设置成1460,因为1460Byte净荷+20Byte TCP头+20Byte IP头 = 1500字节,正好符合链路层最大报文的要求。
http://wenku.baidu.com/view/d77645d533d4b14e84246800.html


strace -p 7269  -o s.log
Nginx太多了进程:
[root@test tmp]# cat strace.sh


都是读4096个字符一次写,pwrite64和这个相当应该:
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);


原型  char *  fgets(char * s, int n,FILE *stream);
    参数:
         s: 字符型指针,指向存储读入数据的缓冲区的地址。
         n: 从流中读入n-1个字符
         stream : 指向读取的流。


函数原型
ssize_t pwrite(intfd, const void *buf, size_tcount, off_toffset);
编辑本段
用法
返回值:成功,返回写入到文件中的字节数;失败,返回-1;
参数:
(1) fd:要写入数据的文件描述符
(2) buf:数据缓存区指针,存放要写入文件中的数据
(3) count:写入文件中的数据的字节数
(4) offset:写入起始地址的偏移量,写入地址=文件开始+offset。注意,执行后,文件偏移指针不变

什么是字节,字节数相关学习备案:
字节(Byte 发音:/‘bait/):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小 。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值:0 最大值:255 。如一个ASCII码就是一个字节,此类单位的换算为:  1KB(Kilobyte 千字节)=1024B,1MB(Megabyte 兆字节 简称“兆”)=1024KB,1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
数据包是信息在通行通道上传递的形式~~
字节是信息的单位~~一字节等于8个比特位!
wc - c 统计字节数:
[root@test ~]# cat a.txt |wc -c
2  [里面写:a的字节数]
[root@test ~]# vi a.txt        
[root@test ~]# cat a.txt |wc -c
8  [里面写:a向东 的字节数]
比特(bit)即一个二进制位  例如100011就是6比特
字节(byte)这是计算机中数据类型最基本的单位了,8bit 组成1byte
字(word)两个byte称为一个word,所以字大小应该是16位bit,共两字节。(Shell里的)
双字(double word 简写为DWORD)见名知意,两个字,四个字节,32bit。
C语言:char 字符型  占1byte 即8位,一个char型数据(例如:a、#、!之类的)用了1个字节来存储:

root@192.168.137.128:~# ./a.out
size of char a=1
size of char =1



中间断开测试,浏览器突然断开:
accept4(5, {sa_family=AF_INET, sin_port=htons(58438), sin_addr=inet_addr("192.168.137.1")}, [16], SOCK_NONBLOCK) = 3
epoll_ctl(13, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET, {u32=3039736117, u64=722997274181808437}}) = 0                    
epoll_wait(13, {{EPOLLIN, {u32=3039736117, u64=722997274181808437}}}, 512, 60000) = 1                              
gettimeofday({1368072732, 443326}, NULL) = 0                                                                        
recv(3, "POST /upload HTTP/1.1\r\nHost: tes"..., 32768, 0) = 32768                                                  
recv(3, "\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 8192, 0) = 8192                          
epoll_wait(13, {{EPOLLIN, {u32=3039736117, u64=722997274181808437}}}, 512, 7) = 1                                  
gettimeofday({1368072732, 446037}, NULL) = 0                                                                        
epoll_wait(13, {}, 512, 4)              = 0                                                                        
gettimeofday({1368072732, 451445}, NULL) = 0                                                                        
open("/data/app/test.local/upload_tmp/0000000005", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4                    
pwrite64(4, "\0\0\0\24ftypisom\0\0\0\1isom\0\rx\373moov\0\0\0l"..., 4096, 0) = 4096                                
pwrite64(4, "\0\2\0\0\0\0\0\0\0\3\0\0\16\20\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 4096, 4096) = 4096              
pwrite64(4, "\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0\0\1\0\0*0\0\0\0\2\0\0\0\0\0\0"..., 4096, 8192) = 4096                  

.........................................


pwrite64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096, 7622656) = 4096          
pwrite64(4, "e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\240\5\343\t\240\335d\t@\327d\t\240.\341\t"..., 4096, 7626752) = 4096
recv(3, 0xa0a9048, 8192, 0)             = -1 EAGAIN (Resource temporarily unavailable)                            
epoll_wait(13, {{EPOLLIN|EPOLLERR|EPOLLHUP, {u32=3039736117, u64=722997274181808437}}}, 512, 60000) = 1          
gettimeofday({1368072745, 256485}, NULL) = 0                                                                      
recv(3, 0xa0a9048, 8192, 0)             = -1 ECONNRESET (Connection reset by peer)                                
pwrite64(4, "s\0i\0t\0o\0r\0y\0\0\0\0\0\36\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"..., 2800, 7630848) = 2800              
close(4)                                = 0                                                                      
unlink("/data/app/test.local/upload_tmp/0000000005") = 0                                                          
write(9, "2013/05/09 12:12:25 [alert] 7269"..., 240) = 240                                                        
close(3)                                = 0                                                                      
epoll_wait(13,  <unfinished ...>  



阅读全文
背景: 我也想升级一把,如果直接上6.4,以前6.3里面的vim配置,服务器等重新安,太麻烦了。
-------------------------------------------------------------------------------------------------------------------------------
最后,发现我的那个已经升级了,不用去修改grub,参考:http://tieba.baidu.com/p/2249307319
阅读全文
背景:搞游戏的相关公司要用这个玩意儿,但怎么用的不了解,先写这儿作下Mark。 阅读全文
背景:前些日子有一外面抓视频的,用那个时间来查20条(大于某个时间Limit 20),因存的是这样的:2013-08-08 21:50:00  ,这样在Mysql数据量大,且没有建立索引(也不好建立索引的情况下),很容易把数据库拖死,其实应该用Unix的时间整数来进行查就快多了,因为这样建立起来的索引的势就高(老外好像是这样说的),查询就快,但现在就是存的时间了,查询时还得以时间来查,前端是输入的Unix时间戳(Unix timestamp),后面还得转一次。
涉及到:js unix时间戳转换 ,PHP时间戳转为Unix时间戳。

阅读全文
背景:前些日子有一外面抓视频的,用那个时间来查20条(大于某个时间Limit 20),因存的是这样的:2013-08-08 21:50:00  ,这样在Mysql数据量大,且没有建立索引(也不好建立索引的情况下),很容易把数据库拖死,其实应该用Unix的时间整数来进行查就快多了,因为这样建立起来的索引的势就高(老外好像是这样说的),查询就快,但现在就是存的时间了,查询时还得以时间来查,前端是输入的Unix时间戳(Unix timestamp),后面还得转一次。
涉及到:js unix时间戳转换 ,PHP时间戳转为Unix时间戳。

阅读全文
夹缝中的80后[罗辑思维:
http://weibo.com/1848090933/zvuLvvtoL?type=repost
失控:http://book.jd.com/10371912.html

大前研一:专业主义,已经买了好久,还没开始阅读。
10658260是什么号码?10658260是什么号?总是发送wap推送短信,很烦人!
10658260是移动自有业务的号码。不想接收的话,可以按以下操作:
1.发“0000”到10086,然後按提示操作就可以了
2.你可以进入手机的信息设置中,将“服务信息”设置为“关闭”。
3.安卓手机请将“Push信息”后的对号取消即可。
4.拨打移动人工服务号码100860取消服务


10658260是移动自有业务的号码。不想接收的话,可以进入手机的信息设置中,将“服务信息”设置为“关闭”。【安卓手机请将“Push信息”后的对号取消即可】
==============
发送QXZSJC到10086就可以取消了【测试实践可用!!!】
对于nginx+php的一些网站,上传文件大小会受到多个方面的限制,一个是nginx本身的限制,限制了客户端上传文件的大小,一个是php.ini文件中默认了多个地方的设置。所以为了解决上传文件大小限定的问题必须要做出多处修改。以下整理了几个地方。

1、修改/usr/local/nginx/conf/nginx.conf 文件,查找 client_max_body_size 将后面的值设置为你想设置的值。比如:

附录:Nginx有一个Upload组件:
上传速率,上传Body大小,也就是上传文件时可能较大?
client_max_body_size 1024M
upload_limit_rate 158k
如下:


2、修改php.ini

在php.ini里面查看如下行:

默认允许HTTP文件上传,此选项不能设置为OFF。
upload_tmp_dir =/tmp/www


在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示每个脚本最大允许执行时间(秒),0 表示没有限制。你可以适当调整max_execution_time的值,不推荐设定为0。

参考文章:
PHP.INI配置:文件上传功能配置教程:http://www.leapsoul.cn/?p=488
分页: 92/339 第一页 上页 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 下页 最后页 [ 显示模式: 摘要 | 列表 ]