Zen Space
php erlang javascript ruby python web linux mac os x
rss
email
twitter
facebook
  • Labs
  • Resume
  • Works
  • About

Archive for the ‘PHP’ Category

在PHP中检查PHP文件是否有语法错误

1 comment
Posted on 十 9 2009 by reeze

之前在当当的时候的一个项目中用到了一个简单的模板引擎,其实也是借鉴discuz来做的模板引擎,很简单,它所作的事情就是把一些自定义的标签编译成php代码。已经说了很简单了,所以编译的时候也名优进行模板语法的检查,那么在开发过程中就会出现编译出来的php文件有语法问题,有语法问题没有关系,我修改重新编译一下就好了。首先不能在每次请求的时候都把php模板重新编译一下,会严重影响性能,折中的处理时在每个编译好的php文件末尾检查一下该模板文件是否已经修改过,根据设定的更新频率,如果又需要则重新编译模板文件,现在的问题是编译出来的php文件自己有语法错误,根本执行不到模板检查那一步,所以即使修改了模板文件中的问题也不会重新编译。 所以我想寻找一种简单的方法来检查生成的php文件是否合法。不合法就重新编译,这样开发过程中就不用出现错误就得手动删除缓存文件了。
在网上找了一下。刚开始以为 token_get_all()函数能处理语法错误的问题,结果发现,它只是做简单的词法分析。没有办法。后来到论坛上去问了一下
http://groups.google.com/group/professional-php/browse_thread/thread/b8581f6b07b10ff0/2601a63c406bb1c1?lnk=gst&q=reeze#2601a63c406bb1c1
有人告诉我有这样一个函数 php_check_syntax() http://www.php.net/manual/en/function.php-check-syntax.php 我想问题就这么坚决了。。我真应该RTF(Read The Fuck Mannual). 仔细一看。这个函数已近被弃用了:
Note: For technical reasons, this function is deprecated and removed from PHP. Instead, use php -l somefile.php from the commandline.
这个technical reason 到底是什么呢? 先不管了,以后再慢慢研究,反正不能使用这个方法就对了。
他们的建议是使用命令行$php -l filename.php 来检查语法。
Gary Every给了我一个代码片段参考:
在命令行下检查问题也不大。如果我要放在在线应用呢? 这就涉及到可移植性的问题了。首先是操作系统,然后就是环境变量。这样的话就会依赖于服务器端的配置。在http://www.php.net/manual/en/function.php-check-syntax.php 上有人贴出了自己的php_check_syntax()函数实现。
有的采用的就是上面的命令行的方法。
后面有提到使用eval的方法来验证。eval方法会执行传入的代码, 如果代码有语法错误则会抛出parser error, 可以使用’@’错误抑制符去掉错误信息,eval和echo一样并不是函数,不能使用变量函数的方法调用比如:
$func = ‘eval’
$func()这样的调用就是无效的。它会提示没有eval函数,如果你自己定义这么一个函数也是有问题的。因为eval是一个关键字。
eval调用和include差不多,如果被包含文件中没有明确return就返回null。如果直接eval我们需要检查的文件会造成被检查的文件内代码被执行,这可不是我们想要的,我们只需要检查一下这个文件的语法是否正确。 我们可以在要检查的文件之前添加return 语句,让代码提前跳出,那么后面的代码就不会执行了。好的,就这么干。代码如下:
checker.php
123456789101112131415161718192021222324<?php

if(!function_exists(’php_check_syntax’)) {
    function php_check_syntax($file_name, &$error_message = null) {
      [...]


Read More

  Tags: PHP, syntax check Category: PHP

基于var_export 和 include返回值的缓存方案

no comments
Posted on 七 2 2009 by admin

前一篇文章我们研究了include调用返回值的问题,并指出可以通过这种方式来完成序列化相同的功能,现在我就来研究一下这种方法的可行性和效率,因为直接的返回php值肯定是比unserialize()函数要快。
第一步我们来研究下怎么将php对象持久化的保存起来。下面是我定义的一些变量:
123456private $_var;
public $pub = array(’pub value’, 3, 4);
public function __constructor($var)
{
$this-&gt;_var = $var;
}
12345678910public function show()
{
echo $this-&gt;_var;
}
}

$string = "It’s a string…";
$array = array(1, 2, ‘key’ =&gt; ‘value’, array(’sub-array’));
$number = 135345.55;
$class = new MyClass(’class var’);
123456//通过serialize()方法我们可以将他们持久化比如:
echo serialize($string); //s:16:"It’s a string…";
echo serialize($array); //a:4:{i:0;i:1;i:1;i:2;s:3:"key";s:5:"value";i:2;a:1:{i:0;s:9:"sub-array";}}
echo serialize($number); //d:135345.5499999999883584678173065185546875;
echo serialize($class); //O:7:"MyClass":2:{s:13:"MyClass_var";N;s:3:"pub";a:3:{i:0;s:9:"pub value";i:1;i:3;i:2;i:4;}}
// 我们可以将这些序列化的结果存到文件中,在需要的时候unserialize()返回得到相应的值,但是现在我不会这么做。
前篇文章提到了通过include返回值来直接取得php值对象,首先我们要把值保存起来,因为我们要通过include来包含它,首先遇到的问题就是我们的序列化函数必须要生成合法的php表达式才行,否则include是无法得到相应的返回值的
比如我们要序列化 字符串 “abcd” 我们可以这么做
1234file_puts_content("data.php", "return ‘abcd’;");
//然后这样取得相应的值
$string = include "data.php";
echo $string; // 它应该输出 [...]


Read More

Category: PHP

PHP中include()函数(以及相关函数)的返回值及避免序列化开销的方法

no comments
Posted on 七 1 2009 by admin

以前乱翻symfony生成的缓存文件的时候看到很多类似:
1<?php return array(’key’ => "value"); ?>
这种表达式,当时并没有怎么在意,今天研究symfony代码的时候看到这样一句代码
1<?php  $this->classes = include($file); ?>;
一直都是通过include require来包含文件,但是从来没有使用过他的返回值,印象中include返回的无非是true或者false吧。今天自己看了下文档,发现在php文件中是可以直接调用return的。比如:
12345678910// return.php
<?php
$value = array(’haha’, 1, 3);
return $value;
?>
// get_return.php
<?php
$value = include("return.php");</span></p>
echo $value; // 输出 Array, 因为$value 是从return.php返回的一个数组
?>
其实项目中很少情况需要这样的返回方法。如果想要从return.php中得到返回值一般是通过调用return.php中所调用的函数来得到。
在symfony中这种方式就很合理,如果大家熟悉symfony的话,应该知道,symfony运行起来以后会在cache目录下生成系统配置文件的缓存 ,诚然可以通过序列化的方式来缓存这些信息,但是反序列化是需要消耗资源的。通过这种方式来做持久化也是个不错的选择.


Read More

Category: PHP

PHP5.2.6中无法在exception_handler函数中抛出异常

no comments
Posted on 六 25 2009 by reeze

在PHP bugs列表中也找到这个bug,但是似乎没有被处理,bug提出的时间是2005年,不知道新版本的有没有解决。
PHP:5.2.6
OS: Mac OS Leopard 10.5.7
Server: Apache 2.2
这个代码就有问题:
function e_handler($e)
{
throw new Exception();
}
set_exception_handler(‘e_handler’);
throw new Exception();
这将会导致
Fatal error: Exception thrown without a stack frame in Unknown on line 0
Update: 这应该属于设计问题,如果在exception_handler()函数中可以跑出异常,则这个异常优惠调用exception_handler(),这样下去就会出现死循环,这就是为什么程序会出错的原因吧。
通过try catch来处理的话就没有问题。。
function e_handler($e)
{
try
{
throw new Exception();
}
catch (Exception $e)
{
echo “catched…”;
}
}
set_exception_handler(‘e_handler’);
throw new Exception();


Read More

  Tags: exception, PHP Category: PHP

PHP调试函数

no comments
Posted on 六 19 2009 by reeze

在项目中经常要调试程序,但是我电脑上的ZendStudio总是没配置好,不能单步调试,不过有时候不一定需要让ZendStudio来帮我们调试,所以写了下面这个辅助函数来方便调试,因为有时候调试的位置加多了自己也不知道到底是加在什么地方了,下面的函数就是方便的dump对象信息,同时显示调试的问题和所在的行数。
123456789101112131415161718//调试函数,方便显示调试函数的位置和文件
function p(){
  $args = func_get_args();

   // 调用栈,debug_backtrace()可以返回调用栈。这样 我们就可以方便的知道函数在哪里调用的。
  $backtrace = debug_backtrace();

  $file = $backtrace[0][’file’];
  $line = $backtrace[0][’line’];
  echo "<pre>";
  echo "$file:$line\n";
  foreach ($args as $arg)
  {
    var_dump($arg);
  }
  echo "</pre>";
  exit;
}


Read More

  Tags: debug, PHP Category: PHP

最近文章

  • 开启Mac OS X Snow Leopard的NTFS原生读写
  • 在2009的尾巴上
  • 支持IPv6的Tunnelblick For Mac OS X OpenVPN客户端
  • Lockerz邀请
  • 在PHP中检查PHP文件是否有语法错误

分类目录

  • G-related (1)
  • Hackintosh (1)
  • JavaScript (1)
  • Mac (4)
  • PHP (5)
  • 乱78糟 (1)
  • 未分类 (4)

标签~云

2009 debug editor exception html JavaScript Mac MacFUSE MacOSX NTFS OS X PHP Snow Leopard softwares ssh syntax check Tools VPN

一些脚印

  • reeze 在 Mac OS 启动sshd服务 上的评论
  • birdbluebloc 在 Mac OS 启动sshd服务 上的评论
  • kevin 在 Lockerz邀请 上的评论
  • reeze 在 Lockerz邀请 上的评论
  • kevin 在 Lockerz邀请 上的评论

Google Reader

  • Xen 初学者指南 | LinuxSir.Org (www.linuxsir.org)
  • 45个吸引人的创新简历 (玩聚SR|最佳)
  • 美女与手机 (陈方毅的灵感日志)
  • 网页表单中的行为也分主次 (所有文章 - UCD大社区)
  • 9 本免费的 Python 语言编程书籍 (LinuxTOY)
Shared Items

日志存档

  • 2010年一月 (1)
  • 2009年十二月 (3)
  • 2009年十月 (2)
  • 2009年七月 (4)
  • 2009年六月 (4)

链接表

  • Ideawu
  • LinuxToy
  • on Github
  • Tina的设计天地
  • 风雪之隅
想读
Programming Collective Intelligence
Collective Intelligence in Action
旅行的艺术
操作系统设计与实现(第三版)(上册)
操作系统概念(第六版 影印版)
正读
Even Faster Web Sites
构建高性能Web站点
晨間日記的奇蹟
深入理解LINUX内核(影印版第3版)
Linux Kernel Development (2nd Edition)
读过
应用Rails进行敏捷Web开发
追风筝的人
构建可扩展的Web站点
Restful Web Services
PHP 5权威编程

  • Resume
  • Works
  • About
Powered by Wordpress  |  Designed by WebTreats