手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

php freetds 处理sqlserver大字段的问题

freetds连接sqlserver是没问题,在连接的时候dsn用的是dblib,而不是mssql。
连接和普通的查询都没有问题,但一旦涉及到大字段,你就会发现问题多多了。比如你的字段类型是nvarchar(max),你在处理的时候你会发现,返回结果都是空。
我晶啊。看来php连接sqlserver还是用windows自己的方案吧:sqlsrv这个组件,但它只能在windows下面使用。

太纠结了

Tags: freetds, sqlserver, 大字段

APC支持php5.4了

时隔一年多,APC终于又更新了,这次更新最大的就是支持PHP5.4:
- Add PHP 5.4 support (Dmitry, Anatoliy, Pierre)
- Fixed bug #22679: Fix apc_bin_dump for constants. Use IS_CONSTANT_TYPE_MASK to handle all the constants, including the unqalified ones (instead of ~IS_CONSTANT_INDEX check)
- Fixed bug #23822, php crashes on apache restart

下载地址在这里:
http://pecl.php.net/package/APC

配置完后还得加入这些信息:

XML/HTML代码
  1. ; alternative php cache 用于缓存和优化php中间代码  
  2.   
  3. apc.cache_by_default = on  
  4. ;sys  
  5. ; 是否默认对所有文件启用缓冲。  
  6. ; 若设为off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。  
  7.   
  8. apc.enable_cli = off  
  9. ;sys  
  10. ; 是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。  
  11.   
  12. apc.enabled = on  
  13. ; 是否启用apc,如果apc被静态编译进php又想禁用它,这是唯一的办法。  
  14.   
  15. apc.file_update_protection = 2  
  16. ;sys  
  17. ; 当你在一个运行中的服务器上修改文件时,你应当执行原子操作。  
  18. ; 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。  
  19. ; 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。  
  20. ; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。  
  21. ; 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。  
  22. ; 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。  
  23. ; 如果你的系统由于大量的io操作导致更新缓慢,你就需要增大此值。  
  24.   
  25. apc.filters =  
  26. ;sys  
  27. ; 一个以逗号分隔的posix扩展正则表达式列表。  
  28. ; 如果源文件名与任意一个模式匹配,则该文件不被缓存。  
  29. ; 注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。  
  30. ; 如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存,  
  31. ; 如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值,可以省略掉。  
  32.   
  33. apc.ttl = 0  
  34. ;sys  
  35. ; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。  
  36. ; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。  
  37.   
  38. apc.user_ttl = 0  
  39. ;sys  
  40. ; 类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。  
  41. ; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。  
  42.   
  43. apc.gc_ttl = 3600  
  44. ;sys  
  45. ; 缓存条目在垃圾回收表中能够存在的秒数。  
  46. ; 此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃,  
  47. ; 而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此ttl值为止。  
  48. ; 设为零将禁用此特性。  
  49.   
  50. apc.include_once_override = off  
  51. ;sys  
  52. ; 关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754  
  53. ; 请保持为off,否则可能导致意想不到的结果。  
  54.   
  55. apc.max_file_size = 1m  
  56. ;sys  
  57. ; 禁止大于此尺寸的文件被缓存。  
  58.   
  59. apc.mmap_file_mask =  
  60. ;sys  
  61. ; 如果使用–enable-mmap(默认启用)为apc编译了mmap支持,  
  62. ; 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为"/tmp/apc.xxxxxx")。  
  63. ; 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。  
  64. ; 对于直接的file-backed内存映射,要设置成"/tmp/apc.xxxxxx"的样子(恰好6个x)。  
  65. ; 要使用posix风格的shm_open/mmap就需要设置成"/apc.shm.xxxxxx"的样子。  
  66. ; 你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。  
  67. ; 不定义此指令则表示强制使用匿名映射。  
  68.   
  69. apc.num_files_hint = 1000  
  70. ;sys  
  71. ; web服务器上可能被包含或被请求的不同源文件的大致数量(建议值为1024~4096)。  
  72. ; 如果你不能确定,则设为 0 ;此设定主要用于拥有数千个源文件的站点。  
  73.   
  74. apc.optimization = 0  
  75. ; 优化级别(建议值为 0 ) 。  
  76. ; 正整数值表示启用优化器,值越高则使用越激进的优化。  
  77. ; 更高的值可能有非常有限的速度提升,但目前尚在试验中。  
  78.   
  79. apc.report_autofilter = off  
  80. ;sys  
  81. ; 是否记录所有由于early/late binding原因而自动未被缓存的脚本。  
  82.   
  83. apc.shm_segments = 1  
  84. ;sys  
  85. ; 为编译器缓冲区分配的共享内存块数量(建议值为1)。  
  86. ; 如果apc耗尽了共享内存,并且已将apc.shm_size指令设为系统允许的最大值,  
  87. ; 你可以尝试增大此值。  
  88.   
  89. apc.shm_size = 30  
  90. ;sys  
  91. ; 每个共享内存块的大小(以mb为单位,建议值为128~256)。  
  92. ; 有些系统(包括大多数bsd变种)默认的共享内存块大小非常少。  
  93.   
  94. apc.slam_defense = 0  
  95. ;sys(反对使用该指令,建议该用apc.write_lock指令)  
  96. ; 在非常繁忙的服务器上,无论是启动服务还是修改文件,  
  97. ; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。  
  98. ; 这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。  
  99. ; 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。  
  100. ; 鼓励设为 0 来禁用这个特性。  
  101.   
  102. apc.stat = on  
  103. ;sys  
  104. ; 是否启用脚本更新检查。  
  105. ; 改变这个指令值要非常小心。  
  106. ; 默认值 on 表示apc在每次请求脚本时都检查脚本是否被更新,  
  107. ; 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。  
  108. ; 如果设为 off 则表示不进行检查,从而使性能得到大幅提高。  
  109. ; 但是为了使更新的内容生效,你必须重启web服务器。  
  110. ; 这个指令对于include/require的文件同样有效。但是需要注意的是,  
  111. ; 如果你使用的是相对路径,apc就必须在每一次include/require时都进行检查以定位文件。  
  112. ; 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。  
  113.   
  114. apc.user_entries_hint = 100  
  115. ;sys  
  116. ; 类似于num_files_hint指令,只是针对每个不同用户而言。  
  117. ; 如果你不能确定,则设为 0 。  
  118.   
  119. apc.write_lock = on  
  120. ;sys  
  121. ; 是否启用写入锁。  
  122. ; 在非常繁忙的服务器上,无论是启动服务还是修改文件,  
  123. ; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。  
  124. ; 启用该指令可以避免竞争条件的出现。  
  125.   
  126. apc.rfc1867 = off  
  127. ;sys  
  128. ; 打开该指令后,对于每个恰好在file字段之前含有apc_upload_progress字段的上传文件,  
  129. ; apc都将自动创建一个upload_的用户缓存条目(就是apc_upload_progress字段值)。  

这样就差不多OK了

Tags: php, apc, eacceraltra, xcache

删除多行注释的正则

一个小正则,可以删除 多行注释:/\*[\S\s]+?(?=\*/)\*/

很简单,就这么一个正则,自己做一个备份。

Tags: 正则

好文推荐:PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

不清楚这些博客是否还会连载,要知道连载这东西真的很耗精力,如果编辑器不好、如果不能自动保存,真的很可能是会失去连载的信息的。事实上,我就是因为这些问题放弃了一些文章的连载。辛苦写了上千字,结果因为编辑器的问题一下子消失了。

再过一段时间,我还是会准备将博客转换到typecho或者wordpress上,毕竟这两个博客软件都是可以支持xmlrpc来投稿的。这样,我就可以用第三方软件来投稿了。(firefox有插件,黑黑)

上链接了,不然会被人骂:(如果有更新,我这里也会同步更新链接,或者你就直接移步该作者的博客吧)

  1. PHP __autoload()方法真的影响性能吗?
  2. PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
  3. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
  4. PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
  5. PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式

暂时只有5篇关于PHP的,这还有一篇对话也可以看看:PHP 跟老大的对话

因为其中这一段可以拿来共勉:

XML/HTML代码
  1. 题外话:曾经我在离开一家工作一年的公司的时候!项目经理就跟我说你如果频繁跳槽,会对你的将来的发展是不利的,但是没有告诉我怎么不利?现在我有点明白了,因为我到过的公司很多技术过硬的人,都是在这个公司带过3年以上的人。我发现如果你在一家公司待很长时间,对你的技术提升是很有帮助的。  
  2. 1》 不停的重构代码,提升你的代码质量。  
  3. 我们开始进入公司的时候,一般都是公司急需赶个项目人手缺乏。等项目完成,一般都是1年左右。如果你在公司待足够长的时间,这个项目多多少少会跟你扯上边的,这时候,你会不停的翻看自己的代码,你也会不断的调整代码, 不断的重构你的代码——跟写文章一眼,你不停的看自己写过的文章,你会不停的做修改,越修改你的文章会越让你喜欢。  
  4. 2》业务熟悉,能够更快更好的写出代码!——我个人比较喜欢“行云流水”似的感觉。  
  5. 你如果在一个公司待了很长一段时间,那么你对这个领域是非常熟悉的。新需求上来,你会很快的知道怎么做代码架构,比如上面提到的,你就知道方法中,哪些代码部分可以抽出来,独立做成一个方法;你也会知道,将来什么地方会频繁修改的。——写代码,如行云流水般!  
当然不一定就很有道理,但也不是完全没有道理

Yii框架中使用PDO时强制将表字段设为小写的BUG

Yii框架的使用者越来越多,虽然大多数情况下都能够被使用的很正常,但偶尔还是有一些小问题,比如mysql对库名和表名区分大小写,但字段名不区分;这个问题就给Yii框架使用者带来很大的烦恼,特别是这个表还不是自己设计的,只是你拿来使用的,这个郁闷程度啊。
于是有人提醒我,应该这么用,在components中的db数组里加入:attributes=>array(PDO::ATTR_CASE,PDO::CASE_LOWER),以达到强制小写的目的,嗯,想法是好的,但是gii没法用了,gii直接报错,排查了半天,发现可能是CMysqlSchema这个类中的createColumn方法导致的错误,因为当你设置为列名小写后,这个方法中的一些判断却还是用的大写,于是很多变量就找不到了,没有办法继续下一步操作,于是我改了一下这个函数:

PHP代码
  1. /** 
  2.  * Creates a table column. 
  3.  * @param array $column column metadata 
  4.  * @return CDbColumnSchema normalized column metadata 
  5.  */  
  6.    protected function createColumn($column) {  
  7.        $column = array_change_key_case($column, CASE_LOWER);  
  8.        $c = new CMysqlColumnSchema;  
  9.        $c->name = $this->getDbConnection()->getColumnCase() == PDO::CASE_LOWER  
  10.                ? strtolower($column['field'])  
  11.                : ($this->getDbConnection()->getColumnCase() == PDO::CASE_UPPER ? strtoupper($column['field'])  
  12.                        : $column['field']);  
  13.        $c->rawName = $this->quoteColumnName($c->name);  
  14.        $c->allowNull = $column['null'] === 'YES';  
  15.        $c->isPrimaryKey = strpos($column['key'], 'PRI') !== false;  
  16.        $c->isForeignKey = false;  
  17.        $c->init($column['type'], $column['default']);  
  18.        $c->autoIncrement = strpos(strtolower($column['extra']), 'auto_increment') !== false;  
  19.        return $c;  
  20.    }  


当然上面的代码很粗燥,我也只是先临时解决这个问题,这么写之后,马上gii就恢复正常了。黑黑

顺便再说一个技巧:以前用gii的时候,对于生成model类都是一个个的输入一个个的生成,总想着应该可以批量生成,但一直不知道如何操作,直到昨天在解决上面的问题时,发现原来在gii里有这样一段代码:

PHP代码
  1. if($this->tableName[strlen($this->tableName)-1]==='*')  

我晶啊,原来那个表名可以写成*啊,这样就是自动生成整个数据库的model了,哎,以前居然一直没在意。

Tags: yii, model