共 29篇 前 6 页:    每页5篇 下一页  

php学习


http://www.cnblogs.com/yorian/archive/2012/03/31/2426633.html
http://blog.163.com/falcom520@126/blog/static/1135346420089263743308/?fromdm&fromSearch&isFromSearchEngine=yes
http://ifelee.blog.sohu.com/172349256.html
/usr/local/php/sbin/php-fpm restart
lunzi   2012-05-12 00:20:59 阅读:312  评论:1  引用:0
test.php
<?php


$domain = "localhost";
$url = '/platform_php_sdk/test4.php';
$header = "POST $url HTTP/1.0\r\n";
$header .= "Content-Type:application/x-www-form-urlencoded\r\n";

$par = "email=zhangzenglun@163.com";

$header .="Content-Length:".strlen($par)."\r\n\r\n";
$fp = @fsockopen($domain,80,$errno,$errstr,30);
fputs($fp, $header.$par);
fclose($fp);

echo 'send ok!';

?>

test4.php

<?php

set_time_limit ( 0 );
ignore_user_abort ( true );
$i = 0;
while ( $i ++ < 50 ) {
file_put_contents ( $i . '.php', $_REQUEST['email'].$i);
sleep ( 3 );
}

?>
lunzi   2012-04-28 19:22:18 阅读:1046  评论:0  引用:0
oauth协议研究两天多了,今天终于调通了基于aouth 1.0的第一个例子程序(基于oauth-php的),开放平台研发终于迈出了重要一步,继续努力!
lunzi   2011-07-20 19:23:59 阅读:131  评论:0  引用:0
解决:Fatal error: Call to undefined function curl_init() in

1、/windows/php.ini ;extension=php_curl.dll(把;去掉了)
2、ssleay32.dll、libeay32.dll和 php_curl.dll 这三个 拷贝到window下边

来源
lunzi   2011-07-19 11:43:16 阅读:348  评论:0  引用:0
第一、eclipse安装phpclipse插件,这步比较简单略过
第二、下载dbg-2.15.5-win32.zip,解压到临时目录后,更名x86子目录下的php_dbg.dll-5.x.x为 php_dbg.dll, 拷贝至php安装目录下的ext扩展所在目录,然后修改php.ini, 加入扩展项, 并且新增debug配置段:
extension=php_dbg.dll
[debugger]
debugger.enabled = true
debugger.profiler_enabled = true
debugger.JIT_host = clienthost
debugger.JIT_port = 7869
第三、  
1. 启动apache, 在eclipse打开php web browser, 可以看到php info输出页面,若是有: ... dbg
DBG php debugger, version 2.15.5, Copyright 2001, 2007, Dmitri Dmitrienko, www.nusphere.com
...信息输出的话,说明dbg调试模块与php集成已生效。若是没有正确集成,请检查上述步骤,并确保各配置参数正确,同时保证 php_dbg.dll所在路径在windows的PATH环境变量内。
   2. 在eclipse里设置php debug项,选中test.php,打开eclipse的菜单中的Run->debug...(这里最好直接点击要测试的文件,然后右键 debug as...菜单),在标签中找到PHP DBG script,新建一个调试配置页,给定名字,并且在右栏各标签中填写类似如下内容:

      File-> Project: nate_on
      File: test.php
      Arguments-> Working Dir: E:\java\server\apache2.2\htdocs (注意路径一定要正确)
      Envirement-> Remote Debug: Remote Debug(勾上) Open with DBGSession URL in internal browser(勾上)
      Remote Sourcepath: E:\java\server\apache2.2\htdocs\nate_on (注意路径一定要正确)
      Interpreter: E:\php\php.exe (如果这类不设置,会没法调试,出现you must define an interpreter before running php.错误)
   3. 最后点击Apply, 切换到eclipse的Debug视图下,先在test.php中设置断点,然后选择eclipse的Debug菜单命令,此时程序将会在断点处挂起,现在就可以查看php变量 和步进跟踪php代码了。


参考资料一
参考资料二

lunzi   2011-03-05 12:14:40 阅读:1137  评论:0  引用:0
今天网管找我说我们公司的discuz论坛不能正常发帖子,查看帖子时老是提示:未定义操作,我测试发帖子时又提示:mythreads' is marked as crashed and should be repaired不能正常发帖子,经过查资料得知,引发次事故的原因是论坛数据库表cdb_mythreads索引被破坏。
然后对论坛数据库表已做修复处理,然后就搞定了。

解决方式:
将“E:\Server\MySQL\MySQL Server 5.0\data\discuz\”路径下的cdb_mythreads.MYI及相关文件cdb_mythreads.MYD拷贝到到“E:\Server\MySQL\MySQL Server 5.0\bin”路径下,使用Myisamchk进行修复:Myisamchk -r cdb_mythreads.MYI。问题解决!

参考
lunzi   2010-04-26 14:29:29 阅读:598  评论:0  引用:0
第一、下载ZendDebugger-5.2.12-cygwin_nt-i386.zip包
第二、设置php.ini
添加:
[DEBUGGER]
zend_extension_ts=E:\php-5.2.6-Win32\ext\ZendDebugger.dll
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
lunzi   2010-03-15 10:09:26 阅读:533  评论:0  引用:0
DISCUZ里的include/common.inc.php是DZ的公共处理程序,很多DZ的程序都包含了它。

利用它,我们可以在它已有的基础上做自己想做的事情。

它定义了DISCUZ_ROOT 这个常量,用于表示论坛所在的文件目录。因为有时候我们不一定在论坛根目录写程序,所以用上这个常量会比较准确定位要引用的文件,在我们要引用文件时,一般也要写上这个。

它引进的include/global.func.php包含了DZ的一些公共函数。所以可以使用这些函数了。

它判断了当前用户是否是搜索引擎,用常量IS_ROBOT区分。利用此,我们可以做一些区分机器人与普通游客分别运行的操作。有时候我们不希望在搜索引擎访问的时候让执行速度变慢,或者我们不希望搜索引擎看到一些东西。

它对$_COOKIE,$_POST,$_GET进行了addslashes 并且进行了类似 extra效果的转换,所以,我们通常不必再使用类似 $_POST[uid] 这样的变量了。所以在做表单的处理的时候,我们就很轻松了,只需要在复制下表单名称再加个$就可以了。

它引进了论坛的配置文件。在那里我们可以得到论坛和UC相关的配置信息。比如,我们常常要使用到的数据库前缀 $tablepre。

它把$_COOKIE里的本论坛专用的变量转换成了$_DCOOKIE,这样方便即区分了COOKIE前缀,又方便了写法。所以我们要使用DZ的dsetcookie和$_DCOOKIE。有人没意识到这个使用了dsetcookie又没使用$_DCOOKIE的话,可能会得不到值,以为没效果。

它实例化了数据库连接类,我们只需要使用$db来进行数据库的操作,比如$db->query();。比如在做充值接口时,虽然充值程序放在了下级目录,但通过引用common.inc.php,依然可以使用$db来方便地进行更改用户金额,这就避免了要自己再去写数据库连接。

它还获得了当前的时间戳,$timestamp,这是经常用到的。它常常用于写进数据库来表示时间,用int 10,在开发中是常用的,比如用于记录某条数据的提交时间。

它还获得了$PHP_SELF, $BASESCRIPT, $BASEFILENAME, $boardurl这些有用的变量。其中$boardurl是很经常用到的,用于表示论坛的根目录的URL。在做JS的站外引用的时候,我们常常就要把$boardurl输出来。

它还获得了当前用户的IP地址,变量是$onlineip。这也是开发中经常要用到的。比如在做投票插件的时候,我们就要记录用户的IP。

它启用了ob_start(),所以我们可以在后面使用类似ob_get_clean() 之类的函数来获取输出内容用于生成静态等等。

它获得了当前用户的UID和用户名,分别是 $discuz_uid和$discuz_user。当然,还有$discuz_userss,不过这个并不常用,这个是未进行addslashes之前的。有些人说用户名是$discuz_userss,并在程序中使用这个,我觉得应该是不对的吧。

它还获得了用户的用户组$groupid,这个常用于判断用户权限,比如某插件只允许哪些用户组使用,就需要根据这个来判断。

在common.inc.php里,$page,$tid,$fid,$typeid都做了处理。所以,我们在别的程序里,一般就可以大胆的使用了,而没有必要再 intval 一下了。其中$page是我们经常要用到的,在写分页的时候,在分页的时候就没有必要再处理它了。刚接触DZ开发的人可能会自己另写一套分页函数,其实DZ有自己的分页函数multi()很好用的,完全可以利用,至于外观和page参数重复,可以输出后替换下和增加样式即可。

它还判断了版块的版主权限,$forum['ismoderator'],在版块列表页和内容主题页,甚至其它含有fid或tid的页面,我们就可以用它来判断是否有管理权限了。

它运行了插件的全局包含和输出之前的页面嵌入类型插件。利用此,我们可以通过插件,在公共程序里全部运行或通过判断当前的CURSCRIPT 决定是否运行代码。

借助它,我们几乎可以做任何我们想做的事情,比如用它做一个单独页面,做一个功能模块。甚至可以不在论坛根目录而是在更深的目录使用它。我们想要用到的东西它几乎都有。当然,它还做了很多其它的有用的处理,因为和二次开发关系不大,这里不提。

使用它之前,仔细阅读它。
来源
源码分析
源码分析
lunzi   2010-01-06 15:35:51 阅读:382  评论:0  引用:0

以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同。

1.
从用户xxx在某一应用程序的login.php,输入用户名,密码讲起。
先用uc_user_login函数到uc server验证此用户和密码,如正确,则写入session,写入cookies,并更新应用程序会员表中的登录ip,登录时间。用户感觉不到这个过程。
2.
然后通过uc_user_synlogin通知uc server 用户xxx登录成功,这个过程可能使用ajax,用户感觉不到通知过程。
3.
uc server收到这个消息后,马上命令手下,把xxx登录的消息,像令牌环一样,发给所有愿意接收(后台中那个是否开启同步登录)这个消息的其它应用程序。其实就是带参数访问一下各应用程序的uc.php,用户感觉不到这个过程。
4.
各应用程序靠api下的uc.php来接收uc server发来的消息,并对uc server言听计从,让干什么就干什么。现在,收到让xxx用户在你的程序中登录的命令,马上执行。
并写本应用程序的session,并且使用p3p, 写入相同域或不同域的cookies.  用户感觉不到这个过程。

5.最后所有和uc整合的程序,xxx均登录成功。用户从www.test.com/bbs登录后, 跳到www.test.com/news同样显示登录。因为bbs 和news系统在后台均已登录。

6.应用程序与uc server的会话结束。


得益于uc设计的精巧过程,整个过程,用户完全感觉不到ucenter的存在.这是整合程序历史上的创新。

以下为其中的一个例子:
Supesite的uc_client和ucenter登录通信过程
1、登录入口Index.php?action-login
//系统频道
if($_SGET['action'] != 'index') {    
if(empty($channels['menus'][$_SGET['action']]['upnameid']) && $channels['menus'][$_SGET['action']]['upnameid'] != 'news') {
$scriptfile = S_ROOT.'./'.$_SGET['action'].'.php';
} else {
$scriptfile = S_ROOT.'./news.php';
}
    
//echo   $scriptfile;
if(file_exists($scriptfile)) {
include_once($scriptfile);
exit();
}
}
登录控制器:Login.php
登录视图:Site_login.html.php
  提交登录action:batch.login.php?action=login
2、登录处理地址batch.login.php?action=login
include_once(S_ROOT.'./uc_client/client.php');

登录操作及其中涉及到的一些函数:
$password = $_POST['password'];
$username = $_POST['username'];
去ucenter进行远程登录验证
$ucresult = uc_user_login($username, $password, $loginfield == 'uid');

如果登录成功
则查本地用户信息
如果有更新本地信息
如果没有插入新的用户数据保持与ucenter进行同步

然后同步其他子系统登录信息
$msg = $lang['login_succeed'].uc_user_synlogin($members['uid']);

function uc_user_synlogin($uid) {
$uid = intval($uid);
$return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
return $return;
}

/**
*  dfopen 方式取指定的模块和动作的数据
*
* @param string $module 请求的模块
* @param string $action 请求的动作
* @param array $arg 参数(会加密的方式传送)
* @return string
*/

function uc_api_post($module, $action, $arg = array()) {
$s = $sep = '';
foreach($arg as $k => $v) {
$k = urlencode($k);
if(is_array($v)) {
$s2 = $sep2 = '';
foreach($v as $k2 => $v2) {
$k2 = urlencode($k2);
$s2 .=
"$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));
$sep2 = '&';
}
$s .= $sep.$s2;
} else {
$s .=
"$sep$k=".urlencode(uc_stripslashes($v));
}
$sep = '&';
}
$postdata = uc_api_requestdata($module, $action, $s);

return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);
}

/**
* 构造发送给用户中心的请求数据
*
* @param string $module 请求的模块
* @param string $action 请求的动作
* @param string $arg 参数(会加密的方式传送)
* @param string $extra 附加参数(传送时不加密)
* @return string
*/

function uc_api_requestdata($module, $action, $arg='', $extra='') {
$input = uc_api_input($arg);
$post =
"m=$module&a=$action&inajax=2&release=".UC_CLIENT_RELEASE."&input=$input&appid=".UC_APPID.$extra;
return $post;
}

function uc_api_url($module, $action, $arg='', $extra='') {
$url = UC_API.'/index.php?'.uc_api_requestdata($module, $action, $arg, $extra);
return $url;
}

function uc_api_input($data) {
$s = urlencode(uc_authcode($data.'&agent='.md5($_SERVER['HTTP_USER_AGENT']).
"&time=".time(), 'ENCODE', UC_KEY));
return $s;
}

/**
*  远程打开URL
*  @param string $url 打开的url, 如 http://www.baidu.com/123.htm
*  @param int $limit 取返回的数据的长度
*  @param string $post 要发送的 POST 数据,如uid=1&password=1234
*  @param string $cookie 要模拟的 COOKIE 数据,如uid=123&auth=a2323sd2323
*  @param bool $bysocket TRUE/FALSE 是否通过SOCKET打开
*  @param string $ip IP地址
*  @param int $timeout 连接超时时间
*  @param bool $block 是否为阻塞模式
*  @return 取到的字符串
*/

function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;
if($__times__ > 2) {
return '';
}
$url .= (strpos($url, '?') === FALSE ? '?' : '&').
"__times__=$__times__";
return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block);
}

function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$matches = parse_url($url);
!isset($matches['host']) && $matches['host'] = '';
!isset($matches['path']) && $matches['path'] = '';
!isset($matches['query']) && $matches['query'] = '';
!isset($matches['port']) && $matches['port'] = '';
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
$port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
$out =
"POST $path HTTP/1.0\r\n";
$out .=
"Accept: */*\r\n";
//$out .= "Referer: $boardurl\r\n";
$out .=
"Accept-Language: zh-cn\r\n";
$out .=
"Content-Type: application/x-www-form-urlencoded\r\n";
$out .=
"User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$out .=
"Host: $host\r\n";
$out .= 'Content-Length: '.strlen($post).
"\r\n";
$out .=
"Connection: Close\r\n";
$out .=
"Cache-Control: no-cache\r\n";
$out .=
"Cookie: $cookie\r\n\r\n";
$out .= $post;
} else {
$out =
"GET $path HTTP/1.0\r\n";
$out .=
"Accept: */*\r\n";
//$out .= "Referer: $boardurl\r\n";
$out .=
"Accept-Language: zh-cn\r\n";
$out .=
"User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$out .=
"Host: $host\r\n";
$out .=
"Connection: Close\r\n";
$out .=
"Cookie: $cookie\r\n\r\n";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return '';
//note $errstr : $errno \r\n
} else {
stream_set_blocking($fp, $block);
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header ==
"\r\n" ||  $header == "\n")) {
break;
}
}

$stop = false;
while(!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
@fclose($fp);
return $return;
}
}

远程同步登录子系统操作之后
//显示信息
function showmessage($message, $url_forward='', $second=3, $vars=array()) {
global $_SGLOBAL, $_SCONFIG, $_SC, $channels;

if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
//直接301跳转
obclean();
header(
"HTTP/1.1 301 Moved Permanently");
header(
"Location: $url_forward");
} else {
if(!defined('IN_SUPESITE_ADMINCP')) {
$tpl_file = 'showmessage';
$fullpath = 0;
include_once(S_ROOT.'./language/message.lang.php');
if(!empty($mlang[$message])) $message = $mlang[$message];
} else {
$tpl_file = 'admin/tpl/showmessage.htm';
$fullpath = 1;
include_once(S_ROOT.'./language/admincp_message.lang.php');
if(!empty($amlang[$message])) $message = $amlang[$message];
}

if(isset($_SGLOBAL['mlang'][$message])) $message = $_SGLOBAL['mlang'][$message];
foreach ($vars as $key => $val) {
$message = str_replace('{'.$key.'}', $val, $message);
}
//显示
obclean();
if(!empty($url_forward)) {
$second = $second * 1000;
$message .=
"<script>setTimeout(\"window.location.href ='$url_forward';\", $second);</script><ajaxok>";
}

include template($tpl_file, $fullpath);
ob_out();
}
exit();
}


Supesite中的Common.php部分解读:

1、define('S_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
dirname(__FILE__)
S_ROOT=E:\mydoc\supesite
2、error_reporting指令确定PHP错误报告敏感度的级别,一共有十三个预定的错误级别,每一个都唯一对应于应用程序或服务器功能。
D_BUG?error_reporting(7):error_reporting(E_ERROR);
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING

3、$_SGLOBAL = $_SBLOCK  = $_SCONFIG = $_SHTML = $_DCACHE = $_SGET = array();
4、
//基本文件
if(!@include_once(S_ROOT.'./config.php')) {
header(
"Location: install/index.php");//安装
exit();
}
include_once(S_ROOT.'./function/common.func.php');
@include_once(S_ROOT.'./data/system/config.cache.php');

5、PHP extract() 函数从数组中把变量导入到当前的符号表中。
$_SCONFIG = array_merge($_SSCONFIG, $_SC);
//合并配置
extract($_SC);
6、函数:get_magic_quotes_gpc()
取得 PHP 环境变量 magic_quotes_gpc 的值。
语法: long get_magic_quotes_gpc(void);
返回值: 长整数
函数种类: PHP 系统功能
本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当 magic_quotes_gpc 打开时,所有的 ' (单引号),
" (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
7、过滤’单引号
function saddslashes($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string);
}
return $string;
}
addslashes()函数的作用是:使用反斜线引用字符串。
8、strlen()函数的作用:取字符串的长度
9、
foreach($_COOKIE as $key => $val) {
if(substr($key, 0, $prelength) == $_SC['cookiepre']) {
$_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val;
}
}

10、getenv
取得系统的环境变量
语法: string getenv(string varname);
11、php strcasecmp()函数
strcasecmp()函数的作用是:对两个字符串进行比较。
12、preg_match
13、ob_start 打开缓冲区
14、preg_replace执行正则表达式的搜索和替换

参考资料
lunzi   2009-12-29 17:20:30 阅读:5798  评论:2  引用:0

<?php
$html = <<<HTML
<a href=
"http://www.amazon.cn/?source=2008hao123banner">a1</a>
<a href=
"http://www.amazon.cn/?source=2009hao123banner">a2</a>
HTML;

// echo $html;

$m = array();
preg_match_all(
"|<a href=\"http://www.amazon.cn/\?source=(\d+)hao123banner\">(.*?)</a>|",$html,$m);

print_r($m);
?>
lunzi   2009-12-27 14:59:30 阅读:202  评论:0  引用:0
Copyright@2004-2010 powered by YuLog