前言:intl自从5.3版本后已经作为php自身的一个模块了。
从pecl安装的intl在php5.3以上版本中做动态编译是会报错的,因为5.3使用了新的内存回收方式,函数写法和5.2不一样。
编译结果就是报如下错误:
collator_class.c:92: error: duplicate ‘static’
而且google结果来看,也不推荐从pecl安装intl。
前言:intl自从5.3版本后已经作为php自身的一个模块了。
从pecl安装的intl在php5.3以上版本中做动态编译是会报错的,因为5.3使用了新的内存回收方式,函数写法和5.2不一样。
编译结果就是报如下错误:
collator_class.c:92: error: duplicate ‘static’
而且google结果来看,也不推荐从pecl安装intl。
涉及的配置文件有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);
今日需要新建一个后台的同步任务。在命令行中敲入以下命令
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 命令可以列出当前已注册的任务。
在编写数据库YML文件的时候,大小写是有影响的。
例如 actAs:{ Timestampable: ~ }其中的开头的T如果小写就会导致错误。
在lib/model/base的class.phpp中则会变为
$timestampable0 = new Doctrine_Template_timestampable();
PHP执行报Fatal error: Class ‘Doctrine_Template_timestampable’ not found。
在使用Symfony时,一定要注意大小写的问题
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();
在看《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
在使用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中测试成功。
今天在命令行下使用php时遇到到内存溢出的问题,终端中提示内存分配不足,超过了8M。这个问题其实很明显也很容易解决,php.ini中设置一下memory_limit就可以了。我遂改为16M,但调试仍然报出这个问题。一时间很是纳闷,因为我是在wamp客户端提供的界面上的php.ini中修改的。于是在整个硬盘全局搜索了一下,发现了两个php.ini文件,一个位于apache目录下,一个位于php目录下。
顿时大悟,apache目录下的php.ini服务于浏览器访问,而php的php.ini才会对终端运行启作用。打开一看果然php目录的ini文件没有被修改。修改一下memroy_limit,问题得到了解决。
当采用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
简单描述一下我之前房网的代码模式。因为我们只有一台服务器,web和mysql放在一起。首先在这台服务器上搭建svn,装载源代码。之后在服务器的apache目录下checkout出一份代码副本(例如hxfang目录),并把域名指向这个副本。而我们本地的开发机上从服务器的svn库check出代码,开发改动之后submit到服务器。同时ssh登陆到服务器上进入hxfang目录执行一条svn up命令,代码的发布就算完成了。