方法其实很简单,就是同步uploads目录
{dede:field.body runphp='yes'} $str = @me; $str3 = preg_replace("/src=\"\/uploads/","src=\"http://img.phpsir.com/uploads",$str); @me = $str3; {/dede:field.body}
方法其实很简单,就是同步uploads目录
{dede:field.body runphp='yes'} $str = @me; $str3 = preg_replace("/src=\"\/uploads/","src=\"http://img.phpsir.com/uploads",$str); @me = $str3; {/dede:field.body}
php5 non-thread-safe和thread-safe这两个版本的区别
从PHP5.2.10版本开始(现在有PHP5.2.10和5.3两个版本),有None-Thread Safe与Thread Safe两种版本的可供选择,这两种版本有何不同,作为使用者来说又应该如何选择呢?下面聚友将为您讲述。
先从字面意思上理解,None-Thread Safe就是非线程安全,在执行时不进行线程(thread)安全检查;Thread Safe就是线程安全,执行时会进行线程(thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式耗尽系统资源。
再来看PHP的两种执行方式:ISAPI和FastCGI。FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI(无论搭配 IIS 6 或 IIS 7)执行 PHP ,都建议下载、执行 non-thread safe 的 PHP (PHP 的二進位檔有兩種包裝方式:msi 、zip ,請下載 zip 套件)。而线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的,所以需要使用Thread Safe的PHP。
今天一个朋友说他的dedecms上传图片加不上水印了
经调试代码最终发下啼笑皆非的原因是,
后台设置水印图片是gif ,但是上传了一个jpeg的图片,仅仅是后缀是gif,导致了php的 imagecreatefromgif 出错
同样的,后台设置水印图片是png,你也得上传一个真的png图片,而不仅仅后缀是png
切,切!
还是那一点,因为godaddy空间可能限制某目录下过多文件,所以ecshop,甚至其他任何cms,shop 程序,试图在单一目录下存储大量图片或者小文件的,请考虑用目录分散避免,
在ecshop的 reformat_image_name 仅仅用 date(“Ym”) 来分布图片
也就是用年4位月两位来设计图片目录,建议可以简单更改为 date(“Ymd”) 按日期分布,就可以避免此类问题
当然你也可以设计为 年4位月两位+00-99 的随机目录,总之确认一点就是,Gd空间为了效率,对咱们做了限制,同时也对服务器管理员提了个醒,
要在系统设计之初就考虑到大量图片分布的问题,这类事情对于大电商也很重要,他们甚至专门有图片服务器,而且采用了分布话处理,启用单独无cookie域名来实现效率优化。
2012 12 29 phpsir 有感
问题描述:
在godaddy空间,出现ecshop相册无法生成,经调试发现是 function move_image_file 内部copy函数出错 ,纠结原因是目标目录内文件过多,修改 reformat_image_name 让再分出一个目录来安置图片
function reformat_image_name($type, $goods_id, $source_img, $position='') { $rand_name = gmtime() . sprintf("%03d", mt_rand(1,999)); $img_ext = substr($source_img, strrpos($source_img, '.')); $dir = 'images'; if (defined('IMAGE_DIR')) { $dir = IMAGE_DIR; } $sub_dir = date('Ym', gmtime()); if (!make_dir(ROOT_PATH.$dir.'/'.$sub_dir)) { return false; } if (!make_dir(ROOT_PATH.$dir.'/'.$sub_dir.'/source_img')) { return false; } if (!make_dir(ROOT_PATH.$dir.'/'.$sub_dir.'/goods_img')) { return false; } if (!make_dir(ROOT_PATH.$dir.'/'.$sub_dir.'/goods_img_2')) { return false; } if (!make_dir(ROOT_PATH.$dir.'/'.$sub_dir.'/thumb_img')) { return false; } if (!make_dir(ROOT_PATH.$dir.'/'.$sub_dir.'/thumb_img_2')) { return false; } switch($type) { case 'goods': $img_name = $goods_id . '_G_' . $rand_name; break; case 'goods_thumb': $img_name = $goods_id . '_thumb_G_' . $rand_name; break; case 'gallery': $img_name = $goods_id . '_P_' . $rand_name; break; case 'gallery_thumb': $img_name = $goods_id . '_thumb_P_' . $rand_name; break; } if ($position == 'source') { if (move_image_file(ROOT_PATH.$source_img, ROOT_PATH.$dir.'/'.$sub_dir.'/source_img/'.$img_name.$img_ext)) { return $dir.'/'.$sub_dir.'/source_img/'.$img_name.$img_ext; } } elseif ($position == 'thumb') { if (move_image_file(ROOT_PATH.$source_img, ROOT_PATH.$dir.'/'.$sub_dir.'/thumb_img/'.$img_name.$img_ext)) { return $dir.'/'.$sub_dir.'/thumb_img/'.$img_name.$img_ext; }else{ if (move_image_file(ROOT_PATH.$source_img, ROOT_PATH.$dir.'/'.$sub_dir.'/thumb_img_2/'.$img_name.$img_ext)) { return $dir.'/'.$sub_dir.'/thumb_img_2/'.$img_name.$img_ext; } } } else { if (move_image_file(ROOT_PATH.$source_img, ROOT_PATH.$dir.'/'.$sub_dir.'/goods_img/'.$img_name.$img_ext)) { return $dir.'/'.$sub_dir.'/goods_img/'.$img_name.$img_ext; }else{ if (move_image_file(ROOT_PATH.$source_img, ROOT_PATH.$dir.'/'.$sub_dir.'/goods_img_2/'.$img_name.$img_ext)) { return $dir.'/'.$sub_dir.'/goods_img_2/'.$img_name.$img_ext; } } } return false; }
上面代码中 goods_img_2 和 thumb_img_2 就是转存目录
故障原因:
ECSHOP的SESSION采用IP生成用户唯1码,这样的话,多线接入的用户在路由自动切换时就会造成IP变化,这样,SESSION也就丢失了,与SESSION相关的登陆、购物车也就失效。
下面是我的解决办法,也许是目前最快捷最有效的方法。
原理:
当用户第一次登陆时,将用户的首次登陆IP存入Cookie,其它功能依然使用ECSHOP的SESSION。
摘选自
http://bbs.ecshop.com/viewthread.php?tid=198499&from=favorites
以前没注意到的,现在可以看下哦
./configure –prefix=/usr/local/php5 –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr –with-libdir=lib64
看到几篇文章,地址如下
http://www.07net01.com/linux/64weixitongxiabianyiPHPzhaobudaokuwenjianwenti_7518_1343998855.html
好文章,好代码,请看下面资料
“SELECT * FROM jieqi_article_article WHERE display=0 AND size>0 AND lastvisit>=1343750400 ORDER BY monthvisit DESC LIMIT 0, 30”
上面的sql 需要对jieqi_article_article 增加索引 index_display_monvisit 在 display 和 monthvisit
方法 alter table jieqi_article_article add INDEX index_display_monvisit(`display`,`monthvisit`);
总结,形式如 select * from table where a = N1 and b = N2 order by c ;
在 a 和 c 做复合索引,可以消除filesort
原地保存,批量缩略图
find . -name "*.jpg" -exec convert -resize 300x300 {} {} \;
首先确认下服务器时间是否和正确时间差距过大,校队下时间就可以了!!!!
apache 2.2 就不说了
php 5.3.14 下载 要用nts 版本 VC9 x86 Non Thread Safe
http://windows.php.net/downloads/releases/php-5.3.14-nts-Win32-VC9-x86.zip
下载 apache mod_fcgi 到这 http://www.apachelounge.com/download/ 现在 apache 2.2 版本的mod_fcgi 哦
下面是个例子 具体文档要参考 http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
LoadModule fcgid_module modules/mod_fcgid.so <IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi .php FcgidInitialEnv PHPRC "D:\APMServ5.2.6\PHP5.3" FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000 FcgidMaxRequestsPerProcess 1000 FcgidMaxProcesses 5 FcgidIOTimeout 120 FcgidIdleTimeout 120 FcgidWrapper "D:\APMServ5.2.6\PHP5.3\php-cgi.exe" .php </IfModule>
至于 php 5.3 支持 zend guard loader ,这比较简单,前提就是一条,必须是 fcgi 模式的php 才行,而mod_php 形式是无法支持 zend guard loader 5.5 的,切记,切记!!!
http://blog.youyiweb.cn/post/fckeditor-swfupload2.5.html
结合上面下载的文件,要注意修改几点
原始库名字不能变 frm文件和 ibdata1 放在正确位置 重要!!! ib_log文件可以删除,使其重生 my.ini 在 [mysqld] 加一句 innodb_force_recovery = 4 用mysqldump 导出 可以修改成 myisam 再导入(非必须)
shopex 4.8.5 的 minipassport 导致了 shopex 的登陆时候不调用 uc的登入函数,也就是不通知uc的各个应用,参考此文可解决
http://bbs.vcoo.cc/show-153-1-1.html
1) 登录ShopEX后台,在购物设置中设置登录方式为“跳转至登录页”的方式;
2) 修改登录代码文件:\core\shop\controller\ctl.passport.php 将 nowredirect 改为 splash
参考
/shopex-ucenter-redirect-splash.html
看到 http://www.ecshop120.com/ecshop-mobanxiugai/article-19.html
这篇文章里面的
{insert name=’goods_sells’ goods_id=$id}
发下里面的部分情可能在有些模板里面会错,要根据当前的环境改写成如下
{insert name=’goods_sells’ goods_id=$goods.goods_id}
C:\Program Files\WinRAR\WinRAR a -sfx -iiconc:\windows\SystemTray.ico c:\1.exe c:\vip
C:\Program Files\WinRAR\rar c -zc:\1.txt c:\1.exe
1.txt
Path=%windir%\xiaoyu
SavePath
Setup=%windir%\xiaoyu\vip\主控.exe
Silent=1
Overwrite=1
一朋友韩文XP 系统,装utf8版本的 ecshop 总是出错,
我查看后发现并无错误,只不过是在朋友系统里面错了
才知道,fckeditor 有自动探测客户端的能力,
修改一处代码修复
FCKConfig.AutoDetectLanguage = false ;
朋友反应 支付宝快捷登陆不好用
检查发现 是因为 openid.php 里面保存 alipay_id 的部分错误的使用了intval函数
结果导致alipay_id 发生了缩短变化 , 删除掉 intval 函数后程序运行正常
$alipay_id = empty($_POST['alipay_id']) ? '' : $_POST['alipay_id'] ;
症状: 同一个paypal账号在多个ecshop 站点使用,出现paypal订单已经支付从而无法支付的状况
includes\modules\payment\paypal.php 修改 function get_code($order, $payment) 函数内 $data_order_id = $order['log_id']; 改为 $data_order_id = 'site2'. $order['log_id']; 修改 function respond() 函数内 $order_sn = substr($_POST['invoice'],5); // 5 是 'site2' 这5个字符的长度,要根据这个修改
ecshop 添加可多次使用的红包步骤 1) 添加一种新的红包类型4 , 文件 admin/templates/bonus_type_info.htm 找到 <input type="radio" name="send_type" value="0" {if $bonus_arr.send_type eq 0} checked="true" {/if} onClick="showunit(0)" />{$lang.send_by[0]} <input type="radio" name="send_type" value="1" {if $bonus_arr.send_type eq 1} checked="true" {/if} onClick="showunit(1)" />{$lang.send_by[1]} <input type="radio" name="send_type" value="2" {if $bonus_arr.send_type eq 2} checked="true" {/if} onClick="showunit(2)" />{$lang.send_by[2]} <input type="radio" name="send_type" value="3" {if $bonus_arr.send_type eq 3} checked="true" {/if} onClick="showunit(3)" />{$lang.send_by[3]} 再其后面添加 <input type="radio" name="send_type" value="4" {if $bonus_arr.send_type eq 4} checked="true" {/if} onClick="showunit(4)" />通用红包 多次使用 2) 生成这类红包字符串 增加文件 admin/templates/bonus_by_print_phpsir.htm 点此下载 bonus_by_print_phpsir 修改文件 admin/bonus.php 找到 elseif ($_REQUEST['send_by'] == SEND_BY_PRINT) { $smarty->assign('type_list', get_bonus_type()); $smarty->display('bonus_by_print.htm'); } 再其后添加 elseif ($_REQUEST['send_by'] == 4) { $smarty->assign('type_list', get_bonus_type_phpsir()); $smarty->display('bonus_by_print_phpsir.htm'); } 3) 增加 get_bonus_type_phpsir 函数 文件 admin/includes/lib_main.php function get_bonus_type_phpsir() { $bonus = array(); $sql = 'SELECT type_id, type_name, type_money FROM ' . $GLOBALS['ecs']->table('bonus_type') . ' WHERE send_type = 4'; $res = $GLOBALS['db']->query($sql); while ($row = $GLOBALS['db']->fetchRow($res)) { $bonus[$row['type_id']] = $row['type_name'].' [' .sprintf($GLOBALS['_CFG']['currency_format'], $row['type_money']).']'; } return $bonus; } 4) 在 bonus.php 里面 找到 if ($_REQUEST['act'] == 'send_by_print') { ........................... } 再其后面添加,处理增加这类红包时候生成方法 if ($_REQUEST['act'] == 'send_by_print_phpsir') { @set_time_limit(0); /* 红下红包的类型ID和生成的数量的处理 */ $bonus_typeid = !empty($_POST['bonus_type_id']) ? $_POST['bonus_type_id'] : 0; $bonus_sum = !empty($_POST['bonus_sum']) ? $_POST['bonus_sum'] : 1; /* 生成红包序列号 */ for ($i = 0, $j = 0; $i < $bonus_sum; $i++) { $bonus_sn = $_POST['bonus_txt']; $db->query("INSERT INTO ".$ecs->table('user_bonus')." (bonus_type_id, bonus_sn) VALUES('$bonus_typeid', '$bonus_sn')"); $j++; } /* 记录管理员操作 */ admin_log($bonus_sn, 'add', 'userbonus'); /* 清除缓存 */ clear_cache_files(); /* 提示信息 */ $link[0]['text'] = $_LANG['back_bonus_list']; $link[0]['href'] = 'bonus.php?act=bonus_list&bonus_type=' . $bonus_typeid; sys_msg($_LANG['creat_bonus'] . $j . $_LANG['creat_bonus_num'], 0, $link); } 5) 修改 bonus.php 让后台显示红包内容 if ($_REQUEST['act'] == 'bonus_list') { ........................... } 和 if ($_REQUEST['act'] == 'query_bonus') { ........................... } 里面增加 if ($bonus_type['send_type'] == 4) { $smarty->assign('show_bonus_sn', 1); } 至此 后台部分完成 前台部分 修改 includes/lib_order.php function bonus_info($bonus_id, $bonus_sn = '') { $sql = "SELECT t.*, b.* " . "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," . $GLOBALS['ecs']->table('user_bonus') . " AS b " . "WHERE t.type_id = b.bonus_type_id "; if ($bonus_id > 0) { $sql .= " AND b.bonus_id = '$bonus_id'"; $row = $GLOBALS['db']->getRow($sql); return $row; } else { $sql .= " AND b.bonus_sn = '$bonus_sn'"; $row = $GLOBALS['db']->getRow($sql); } if($row['send_type'] == 4) // phpsir 如果是第4类型红包,那么就找一个未使用的红包,这种红包可被多次使用,不限制每人使用次数 { $sess_userid = $_SESSION["user_id"]; $sql = "SELECT t.*, b.* " . "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," . $GLOBALS['ecs']->table('user_bonus') . " AS b " . "WHERE t.type_id = b.bonus_type_id and b.used_time = 0 "; if ($bonus_id > 0) { $sql .= "AND b.bonus_id = '$bonus_id'"; } else { $sql .= "AND b.bonus_sn = '$bonus_sn'"; } //print $sql; $row = $GLOBALS['db']->getRow($sql); //var_dump($row); return $row; } // 如果想每人只使用N次,请用下面的部分 /* if($row['send_type'] == 4) // phpsir 如果是第4类型红包,那么就找一个未使用的红包,这种红包可被多次使用,不限制每人使用次数 { $sess_userid = $_SESSION["user_id"]; $sql = "SELECT t.*, b.* " . "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," . $GLOBALS['ecs']->table('user_bonus') . " AS b " . "WHERE t.type_id = b.bonus_type_id and b.user_id = '$sess_userid' and b.bonus_sn = '$bonus_sn' "; $rows = $GLOBALS['db']->getAll($sql); $allow_used_bonus_num = 2; // 最大允许使用次数 if(count($rows) >= $allow_used_bonus_num ) { return false; }else{ $sql = "SELECT t.*, b.* " . "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," . $GLOBALS['ecs']->table('user_bonus') . " AS b " . "WHERE t.type_id = b.bonus_type_id and b.used_time = 0 and b.bonus_sn = '$bonus_sn' "; $row = $GLOBALS['db']->getRow($sql); return $row; } } */ return $row; }
2015-03-31 付:
今天有人要求在 user.php 里面增加红包的函数里面也增加 此类功能,付如下
function add_bonus($user_id, $bouns_sn) { if (empty($user_id)) { $GLOBALS['err']->add($GLOBALS['_LANG']['not_login']); return false; } /* 查询红包序列号是否已经存在 */ $sql = "SELECT bonus_id, bonus_sn, user_id, bonus_type_id FROM " .$GLOBALS['ecs']->table('user_bonus') . " WHERE bonus_sn = '$bouns_sn'"; $row = $GLOBALS['db']->getRow($sql); //var_dump($row); if ($row) { //phpsir if($row['send_type'] == 4) // phpsir 如果是第4类型红包,那么就找一个未使用的红包,这种红包可被多次使用,不限制每人使用次数 { $sql = "SELECT t.*, b.* " . "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," . $GLOBALS['ecs']->table('user_bonus') . " AS b " . "WHERE t.type_id = b.bonus_type_id and user_id = '$user_id' "; if ($bonus_id > 0) { $sql .= "AND b.bonus_id = '$bonus_id'"; } else { $sql .= "AND b.bonus_sn = '$bouns_sn'"; } //echo $sql; $row = $GLOBALS['db']->getRow($sql); //var_dump($row); // 此处是限制某用户只能使用一次此红包 仅仅在用户没有使用过的情况下,进入下面的语句中,分发一个未用红包。 if(!$row){ $sql = "SELECT t.*, b.* " . "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," . $GLOBALS['ecs']->table('user_bonus') . " AS b " . "WHERE t.type_id = b.bonus_type_id and b.used_time = 0 and user_id = 0 "; if ($bonus_id > 0) { $sql .= "AND b.bonus_id = '$bonus_id'"; } else { $sql .= "AND b.bonus_sn = '$bouns_sn'"; } //echo $sql; $row = $GLOBALS['db']->getRow($sql); //var_dump($row); } } if ($row['user_id'] == 0) { //红包没有被使用 $sql = "SELECT send_end_date, use_end_date ". " FROM " . $GLOBALS['ecs']->table('bonus_type') . " WHERE type_id = '" . $row['bonus_type_id'] . "'"; $bonus_time = $GLOBALS['db']->getRow($sql); $now = gmtime(); if ($now > $bonus_time['use_end_date']) { $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_use_expire']); return false; } $sql = "UPDATE " .$GLOBALS['ecs']->table('user_bonus') . " SET user_id = '$user_id' ". "WHERE bonus_id = '$row[bonus_id]'"; $result = $GLOBALS['db'] ->query($sql); if ($result) { return true; } else { return $GLOBALS['db']->errorMsg(); } } else { if ($row['user_id']== $user_id) { //红包已经添加过了。 $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_is_used']); } else { //红包被其他人使用过了。 $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_is_used_by_other']); } return false; } } else { //红包不存在 $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_not_exist']); return false; } }
关键一步:
vncserver服务可以在系统引导时自动启动. 但是需要进行设置才能使之正常自动启动.
首先,编辑/etc/sysconfig/vncservers文件,把使用VNC服务的用户添加到这个文件中,添加的内容如下例所示:
VNCSERVERS=”N:user”
此处N指VNC服务器所在的显示服务器编号。user指运行VNC的 用户。多个显示服务和用户之间可通过如下设置来指定:
VNCSERVERS=”N:user1 Y:user2″
来自
http://wfbwx.blog.hexun.com/31750918_d.html
问题描述:
某客户的ecshop后台登陆后,显示成功,但是自动退出到登陆界面。
问题解决:
因为 windows 系统不区分目录大小写,而php是区分大小写的
那么 http://你的域名/admin/ 和 http://你的域名/Admin/ 就不一样
如果你用后者登陆系统,就会出现自动退出的情况
具体原因在 admin/includes/init.php 里面代码决定,
要求是 data/config.php 里面的 ADMIN_PATH 必须严格和你的登陆地址一致,包括大小写!!!
if ($_REQUEST['act'] != 'login' && $_REQUEST['act'] != 'signin' && $_REQUEST['act'] != 'forget_pwd' && $_REQUEST['act'] != 'reset_pwd' && $_REQUEST['act'] != 'check_order') { $admin_path = preg_replace('/:\d+/', '', $ecs->url()) . ADMIN_PATH; if (!empty($_SERVER['HTTP_REFERER']) && strpos(preg_replace('/:\d+/', '', $_SERVER['HTTP_REFERER']), $admin_path) === false) { if (!empty($_REQUEST['is_ajax'])) { make_json_error($_LANG['priv_error']); } else { ecs_header("Location: privilege.php?act=login\n"); } exit; } }
新装了的xp sp3系统的笔记本,在装了360后,一键优化后,发现进入系统缓慢,经排查发现把msdtc服务开启,速度提高显著
sc config msdtc start= auto
用这个命令打开下msdtc服务
51EC助手, 提示:连接失败,请检查用户名是否正确。注:请不要使用中文密码!
ecaService.php 文件需要更新
function checkLogin($username, $password) { $username = base64_decode($username); $password = base64_decode($password); //$username = str_iconv(ECS_CHARSET, EC_CHARSET, $username); //$password = str_iconv(ECS_CHARSET, EC_CHARSET, $password); //return true; $sql="SELECT `ec_salt` FROM ". $GLOBALS['ecs']->table('admin_user') ." WHERE user_name = '" . $username ."'"; $ec_salt =$GLOBALS['db']->getOne($sql); $sql = "SELECT user_id, user_name, password, last_login, action_list, last_login". " FROM " . $GLOBALS['ecs']->table('admin_user') . " WHERE user_name = '" . $username. "' AND password = '" . md5(md5($password).$ec_salt). "'"; $row = $GLOBALS['db']->getRow($sql); if ($row) { return true; }else{ return false; } }
http://union.tenpay.com/b2cpatchs.shtml