01
Jun 11

PHP5.3.2编译intl

前言:intl自从5.3版本后已经作为php自身的一个模块了。

从pecl安装的intl在php5.3以上版本中做动态编译是会报错的,因为5.3使用了新的内存回收方式,函数写法和5.2不一样。
编译结果就是报如下错误:
collator_class.c:92: error: duplicate ‘static’

而且google结果来看,也不推荐从pecl安装intl。


18
Feb 11

Symfony在生产环境prod下开启log

涉及的配置文件有3个:

1: apps/frontend/config/factories.yml,
默认是:

logger:
    class:   sfNoLogger
    param:
      level:   err
      loggers: ~

改为:

 logger:
    class: sfAggregateLogger
    param:
      level: debug
      loggers:
        sf_web_debug:
          class: sfWebDebugLogger
          param:
            level: debug
            condition:      %SF_WEB_DEBUG%
            xdebug_logging: true
        sf_file_debug:
          class: sfFileLogger
          param:
            level: debug
            file: %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log

2:apps/frontend/config/settings.yml

prod:
  .settings:
    no_script_name:         on
    logging_enabled:        on
    web_debug:              on

3:如果要开启doctrine的log,config/ProjectConfiguration.class.php
在function setup()里
加上:

sfConfig::set('sf_debug', true);

11
Feb 11

Symfony task is not defined

今日需要新建一个后台的同步任务。在命令行中敲入以下命令

symfony generate:task sync
系统提示
>> task Creating “/workspace/myproject/lib/task/syncTask.class.php” task file

到此该任务创建成功。但我在调用的过程中遇到了问题。
symfony myproject:sync
解释一下以上命令:因为我是在myproject项目下新建的任务,所以在运行时加上了myproject这个命名空间。
Task “myproject:sync” is not defined.

问题产生的原因是在系统生成的syncTask.class.php中没有配置namespace。
在configure方法中 $this->namespace = ‘myproject’;这样就可以了。

此外在命令行下直接运行symfony 命令可以列出当前已注册的任务。


21
Jan 11

symfony大小写问题导致Doctrine加载错误

在编写数据库YML文件的时候,大小写是有影响的。
例如 actAs:{ Timestampable: ~ }其中的开头的T如果小写就会导致错误。

在lib/model/base的class.phpp中则会变为
$timestampable0 = new Doctrine_Template_timestampable();

PHP执行报Fatal error: Class ‘Doctrine_Template_timestampable’ not found。

在使用Symfony时,一定要注意大小写的问题


18
Jan 11

Doctrine Pager使用groupBy作为限定条件

symfony的分页自然是使用sfPager类了。sfDoctrinePager继承sfPager并且拥有一系列针对Doctrine数据抽象的分页操作函数。

今天碰到一个需求需要在分页中加入groupBy作为条件限定,查询api发现sfDoctrinePager有一个setQuery方法。这样就可以达到将任意的sql加入到分页中了。

        $q = Doctrine_Core::getTable('users')->createQuery()->groupBy('role');
        $this->pager = new sfDoctrinePager('users',15);
        $this->pager->setQuery($q);
        $this->pager->setPage($this->getRequestParameter('page',1));
        $this->pager->init();

15
Jan 11

PHP中可选参数个数的重载方式

在看《PHP in Action》中看到PHP类Java和C++的可选参数个数的重载方式。大学当时写过类似的C++程序,但这种方式PHP中并不常见。

abstract class OverloadableOject {
    function __call($name,$args) {
        //定义方法的命名方式
        $method = $name."_".count($args);
        if (!method_exists($this,$method)) {
            throw new Exception("Call to undefined method");
        }
        //调用类内部的对应方法
        return call_user_func_array( array($this,$method),$args);
    }
}

class Multiplier extends OverloadableOject {
    function multiply_2($one,$two) {
        return $one * $two;
    }

    function multiply_3($one,$two,$three) {
        return $one * $two * $three;
    }
}

$multi = new Multiplier;
echo $multi->multiply(3,4);
echo "\n";
echo $multi->multiply(3,4,5);

测试输出:

$ php index.php
12
60


07
Jan 11

Symfony中利用表单vlidator进行Ajax输入验证

在使用Symfony开发过程中遇到这样的问题:需要对用户通过Ajax提交的字段进行验证。而验证的规则是在Symfony的表单中写好的。如何能不在action重新编写验证规则,转而利用Form组件中已有的validator呢?

    /**
     * 用于Ajax字段的验证
     *
     * 采用表单Form对象中设定的规则对Ajax字段的合法性进行验证
     * 其中第二个参数采用key=>value这样的数组。key为数据库表对应字段名,value为值
     *
     * @param mixed $form
     * @param mixed $fields
     * @access protected
     * @return void
     */
    protected function validateAjaxField($form, $fields)
    {
        $msg = '';
        if ( is_array($fields) ) {
            foreach($fields as $k=>$v) {
                try {
                    $validator = $form->getValidator($k);
                } catch (InvalidArgumentException $e) {
                    //如果找不到该字段的validator则跳出
                    continue;
                }
                try {
                    $validator->clean($v);
                } catch (sfValidatorError $validatorError) {
                    $msg .= str_replace('%value%', $v, $validatorError->getMessage());
                }
            }
        }

        return $msg;
    }

对前台传入的各个字段去找寻相对应form中的validator,获取错误信息返回就可以了。在action中测试成功。


15
Dec 10

两个php.ini

今天在命令行下使用php时遇到到内存溢出的问题,终端中提示内存分配不足,超过了8M。这个问题其实很明显也很容易解决,php.ini中设置一下memory_limit就可以了。我遂改为16M,但调试仍然报出这个问题。一时间很是纳闷,因为我是在wamp客户端提供的界面上的php.ini中修改的。于是在整个硬盘全局搜索了一下,发现了两个php.ini文件,一个位于apache目录下,一个位于php目录下。

顿时大悟,apache目录下的php.ini服务于浏览器访问,而php的php.ini才会对终端运行启作用。打开一看果然php目录的ini文件没有被修改。修改一下memroy_limit,问题得到了解决。


07
Dec 10

fopen采用wrapper协议打开

当采用Http协议打开文件时,fopn是不支持写模式的。

所以在本地开发时,不能采用http://127.0.0.1/file.txt这样的url。如果必须写的话应该要用本地文件的路径例如:d:/wamp/www/file.txt。
此外值得注意的是safe_mode和open_dir选项。这些选项从安全性上考虑将可以读取的目录限定死了,就算采用本地路径将仍不能打开。

php定义了一系列所支持的网络协议:
可参考http://cn.php.net/manual/en/wrappers.php


05
Nov 10

海都网代码部署以及发布管理

简单描述一下我之前房网的代码模式。因为我们只有一台服务器,web和mysql放在一起。首先在这台服务器上搭建svn,装载源代码。之后在服务器的apache目录下checkout出一份代码副本(例如hxfang目录),并把域名指向这个副本。而我们本地的开发机上从服务器的svn库check出代码,开发改动之后submit到服务器。同时ssh登陆到服务器上进入hxfang目录执行一条svn up命令,代码的发布就算完成了。

Continue reading →