PHP关闭魔术引号magic_quotes_gpc

magic_quotes_gpc 指令只能在系统级关闭,在运行时无法关闭。也就是说不能用 ini_set('magic_quotes_gpc',0);来关闭。

在无法修改服务器段配置文件的情况下,还有种办法是使用 .htaccess 来修改配置。

php_flag magic_quotes_gpc Off

但这种也有局限性,apache如果是以cgi形式跑不是作为模块的话也无效。

所以为了更好的提高移植性,只要在代码上动功夫。当然这会带来效率上的降低,如果能修改配置文件还是最好的。

ThinkPHP URL自己带上参数PHPSESSID

碰到个问题,ThinkPHP项目程序本地测试没问题,传到服务器后第一次访问,页面的所有URL会自己带上类似?PHPSESSID=28954583914413546c6e881cfa7c8117 这样的参数,再点击刷新下页面后访问才正常。

浏览器并没有禁止cookie,本地访问正常也证实了这点,第一猜想是服务器的环境配置与项目代码某些地方冲突所影响。

检测了服务器的关于cookie的配置对比本地的,发现session.use_trans_sid这个项的配值是不同的,本地关闭,服务器是开着的。

PHP中的会话在默认情况下是使用客户端的cookie来保存session_id的,所以当客户端的cookie出现问题的时候就会影响会话了。其实会话不一定必须依赖cookie,当客户端的cookie被禁用或出现问题时,PHP会自动把session_id附加在URL中,这样再通过 session_id就能跨页使用会话变量了。但这种自动的附加也是有一定条件的,首先,在php.ini文件中的session.use_trans_sid = 1或者编译时打开了--enable-trans-sid选项,其次,运行PHP的服务器必须是UNIX/Linux系统,Windows操作系统不具备此项功能。

上面的引用就说明了这点,在linux系统下,在session.use_trans_sid开启的时候,导致项目会自己加上PHPSESSID参数来达到跨页会话。

最后解决是:ini_set('session.use_trans_sid', 0);
//在项目代码初始化的位置加入这句

其实还有个怀疑,可能项目某配置出现问题。待查。

Ps,这问题也反面教了件事,在处理跨页会话跨域会话的时候,session.use_trans_sid或许能起到奇效。

emlog的日志别名功能

emlog3.3的版本就给自己这个博客弄了日志别名(自定义URL)的功能,因为感觉这功能对seo很重要。后来更新到3.5.2也把这功能同步过去了。

emlog日志别名功能效果图1

emlog日志别名功能效果图2

看了下emlog的新版本4.0的新功能点,貌似也支持日志别名功能了,还有其他挺多的,目前没有升级的打算。昨天在官方博客那边说了下挺多人来问如何实现日志别名功能的,这里简单描述下。

弄emlog的日志别名功能先给数据库blog表添加一个字符串类型的字段url。借助的是Google的翻译接口,站里另外骗文章有这东东:js-使用google翻译接口API

关键代码下载:emlog开发日志别名自定义URL功能代码下载

另外还要配合.httaccess的解析或者通过index.php唯一入口对请求的url进行路由转换。

自从使用emlog以来,数数算算,自己添加的功能也多的。

最早的emlog标签球获取热门100条,根据叨叨的话添加随机标题后缀,日志自定义URL,自定义Page页面,热门日志功能,网站xml地图功能,网站标签库,面包屑,重新整理文章归档,日志相关文章推荐,文章关键字提取,评论列表的gravatar头像,评论发信通知博主,回复通知留言者,网站在线群聊等等。。

这些效果看图片:

emlog热门日志功能

emlog热门日志功能效果图

emlog网站xml地图功能

emlog网站日志功能效果图

emlog网站面包屑功能

emlog网站面包屑功能效果图

emlog文章归档

emlog文章归档效果图1

emlog归档效果图2

emlog日志相关推荐文章功能

emlog日子相关推荐功能效果图


emlog评论列表gravatar头像功能

emlog评论列表gravatar头像效果图

emlog在线群聊功能

emlog多人在线群聊功能

Python的内建比较函数cmp比较原理剖析

cmp( x, y):比较2个对象,前者小于后者返回-1,相等则返回0,大于后者返回1.

Python的cmp比较函数比较原理

Python的cmp函数可以比较同类型之间,或者不同数据类型之间。然后根据Python的cmp比较函数的返回值来判定比较大小。

>>> list1, list2 = [123, 'xyz'], [456, 'abc']
>>> cmp(list1, list2)
-1

>>> cmp(list2, list1)
1
>>> list3 = list2 + [789]
>>> list3
[456, 'abc', 789]

>>> cmp(list2, list3)
-1

观察上面cmp函数的几个比较,可以总结:

Python的cmp比较函数
,如果我们比较的是两个同类的对象,比较操作是非常直观的。

  • 数字和字符串的比较,直接比较它们的值。
     
  • 对于序列类型的比较,方式上有相似。Python在两个对象基本不能比较的时候尽量做出公平的结果。比如当两个对象没有关系时,或者两种类型根本就没有用于比较的函数时,这时 Python只能根据"逻辑"来做出结论。比较的算法逻辑:
    1.   对两个列表的元素进行比较.
    2.   如果比较的元素是同类型的,则比较其值,返回结果.
    3.   如果两个元素不是同一种类型,则检查它们是否是数字.
         a. 如果是数字,执行必要的数字强制类型转换,然后比较.
         b. 如果有一方的元素是数字,则另一方的元素"大"(数字是"最小的")
         c. 否则,通过类型名字的字母顺序进行比较.
    4.   如果有一个列表首先到达末尾,则另一个长一点的列表"大".
    5.   如果我们用尽了两个列表的元素而且所有元素都是相等的,那么结果就是个平局,就
    是说返回一个 0.

这就是Python的cmp函数比较原理
了。

Python通用序列类型数据的操作

Python的序列

Python有6种内建的序列,包括:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。其中最为常用的是Python的列表和元组。

Python序列的应用

Python在操作一组数据时,通常是用序列来表示这组信息。(序列也可以包含其他序列)

Python还有一种叫做容器的数据结构。容器是包含其他对象的任意对象。序列(如元组和列表)和映射(比如字典)就是两类主要的容器。

序列的每个元素有自己的编号(元组可以作为字典的键名),而映射的每个元素则有一个自己的名字(键)。另外还有种容器类型既不是序列也不是映射,叫做集合。

通用的序列操作

所有序列类型的数据结构都可以进行某些特定的操作,如;索引
分片


和检查每个元素是否属于序列的成员(成员资格
)。

索引

序列的所有元素都有自己的编号,从0开始,通过编号访问即为索引。

>>>indexing = 'python'
>>>indexing[1]
'y'
>>>indexing[-1]
'n'

或者字符串直接索引

>>>'python'[0]
'p'

分片

使用索引是用来访问单个元素,而使用分片操作是用来访问一定范围内的元素。分片是通过冒号相隔的两个索引来实现。

>>>sliceing = '<a href="//sjolzy.cn/">python</a>'
>>>sliceing[9:26]
'//sjolzy.cn/'
>>>num= [1,2,3,4,5,6]
>>>num[3:6]
[4, 5, 6]
>>>num[-3:-1]
[4, 5]
>>>num[-3:]
[4, 5, 6]
>>>num[:]
[1,2,3,4,5,6]

分片有个隐式的设置:步长。上面的步长都为1。

比如:

>>>num= [1,2,3,4,5,6]
>>>num[3:6:1] #这边是个隐藏的步长1
[4, 5, 6]
>>>num[3:6:2] #步长改为2
[4, 6]

序列相加

通过加号来进行序列的连接操作。

>>>[1,2]+[3,4]
[1,2,3,4]
>>>[1,2]+'python'
TypeError: can only concatenate list (not "str") to list
#报错了,相同类型的序列才能进行连接操作。

乘法

用数字x乘以一个序列得到新的序列,新的序列为原来的序列重复x次。

>>>[1] * 3
[1, 1, 1]

成员资格 (检测元素是否属于序列的成员)

要检查一个值是否在序列中,可以使用in运算符。返回的是布尔值。

>>>per = 'python'
>>>'py' in per
True

注:in是区分大小写的。

Apache报错"0x6eec38dc"指令引用的"0x00000000"内存。该内存不能为"read"。

Apache内存不能为read

启动Apache报错"0x6eec38dc"指令引用的"0x00000000"内存。该内存不能为"read"。

原因是:配置过httpd.conf,添加了一个指向移动硬盘的网站配置。

<VirtualHost *:80>
        DirectoryIndex   index.html index.php
        ServerName   "www.sjolzy.cn"
        DocumentRoot   "J:/www/sjolzy.cn"
    <Directory "J:/www/sjolzy.cn">
        Options Indexes MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all    
    </Directory>
</VirtualHost>

J是移动硬盘的盘符,早两天的时候配置的,这两天启动Apache都报错内存不能为Read
:‘"0x6eec38dc"指令引用的"0x00000000"内存。该内存不能为"read"。’,晚上才想起。删了重启,果然可以了。

坑爹两天。