speed.php问题求助
发布于:2022-01-17 09:50:54
#1 jake
本帖供新版SpeedPHP框架进行问题反馈,对新版SpeedPHP有任何问题,请直接跟帖,我们会回复你的。
2015-08-10 16:29:48
#2 jake
[一个站长] 提供: 下载运行了新版speed.php 框架。发现运行提示
Notice: Undefined index: debug in D:\web\[url]www.speed.com[/url]\protected\lib\speed.php on line 476
调试后,发现配置文件config的数组加载不进来。
然后配置文件config最后一句:return $domain[$_SERVER["HTTP_HOST"]] + $config;
返回当前域名下的数组+$config数组。。提示[$domain[$_SERVER["HTTP_HOST"]] 未被定义
然后把配置文件的"localhost" => array(
修改成 $_SERVER["HTTP_HOST"]=> array(
运行成功了。。。
2015-08-11 08:22:49
#3 jake
[Cigery提供] 应用程序默认路径加了斜杠后 但是在 在speed框架文件中 引用config文件时 会多出一个斜杠 @jake
2015-08-11 08:26:15
#4 jake
是这样的,config.php内的内容,$domain参数的key,是可以对应上域名,这样方便把线上配置和本地调试配置共存,而上线时不需要再修改。
比如说本地调试域名是localhost,线上域名是[url]www.speedphp.com[/url],那么:
$domain = array( "localhost" => array( 'debug' => 1, ), "www.speedphp.com" => array( 'debug' => 0, ), ); 这样的话,在本地调试时,就用到了"localhost"的配置,当代码传到线上时,则用到了"www.speedphp.com"的配置。
2015-08-11 08:32:06
#6 cigery
比如你在 $domain配置中 的$key 是 localhost 浏览器中访问就需用localhost 而不能用127.0.0.1
2015-08-11 11:29:55
#7 978868928
非常支持,对于超微型项目非常适合,例如一些微信活动页之类的系统!
感谢!
2015-08-11 16:15:27
#8 cigery
在模板中使用多维数组循环 报错 Err: Parameters of 'foreach' is incorrect! 不知道问题出在哪
<{foreach $menus as $v}><{$v.name}> <{foreach $v.children as $vv}> <{/foreach}> <{/foreach}>
2015-08-17 11:16:16
#9 cigery
<{foreach $v.children as $vv}> 这样的写法是错误的? 应该如何写?
2015-08-18 21:06:38
#10 jake
mark一下,刚回到,尽快会搞搞{:soso_e181:}
2015-08-22 07:49:27
#11 jake
写法是正确的,已经修正了匹配规则,新获取的GIT上面的speed.php即可。—— 要删除tmp目录里面的文件哦。
2015-08-24 10:55:09
#12 vsxp
新版本可以用作生产环境么?另,有相关参考资料已经发消息与你私聊。
2015-08-27 17:14:08
#13 jake
可以,核心代码已经在生产环境跑了有三年余了
2015-08-27 17:42:31
#14 cigery
J大, 模板中的逻辑判断语句少了个 elseif
'<{elseif\s*(.+?)}>' => '',
记得加上哦
2015-08-29 22:47:02
#15 jake
{:soso_e117:}厄...mark先,
谢谢哦
2015-08-29 23:14:00
#16 jake
已经修复{:soso_e181:},感谢哦
2015-08-31 09:17:15
#17 lvqing
wdcp 系统下,已经修改了 config.php 线上配置 参数,包括域名和数据库连接
访问前台页面时空白。
$GLOBALS dump 出来的数据,数据库连接参数隐藏了一下
array(3) { ["debug"]=> int(1) ["mysql"]=> array(6) { ["MYSQL_HOST"]=> string(9) "localhost" ["MYSQL_PORT"]=> string(4) "3306" ["MYSQL_USER"]=> string(8) "XXXXXXXX" ["MYSQL_DB"]=> string(8) "XXXXXXXX" ["MYSQL_PASS"]=> string(8) "XXXXXXXX" ["MYSQL_CHARSET"]=> string(4) "utf8" } ["rewrite"]=> array(4) { ["admin/index.html"]=> string(16) "admin/main/index" ["admin/_.html"]=> string(13) "admin//" ["/"]=> string(7) "/" ["/"]=> string(10) "main/index" } }
不知道还有啥没有配置好。
2015-09-01 10:53:25
#18 lvqing
speed.php 加了 var_dump 输出
但是 var_dump ($GLOBALS['debug']); 无输出,页面空白。
define('SPEED_VER', '0.1');
set_error_handler("_err_handle");
defined('DS') or define('DS', DIRECTORY_SEPARATOR);
//var_dump (APP_DIR.DS.'protected'.DS.'config.php');
$GLOBALS = require(APP_DIR.DS.'protected'.DS.'config.php');
//var_dump ($GLOBALS);
var_dump ($GLOBALS['debug']);
if($GLOBALS['debug']){
error_reporting(-1);
ini_set("display_errors", "On");
}else{
error_reporting(E_ALL & ~(E_STRICT|E_NOTICE));
ini_set("display_errors", "Off");
ini_set("log_errors", "On");
}
2015-09-01 11:19:01
#19 jake
页面空白应该是主机没设置显示错误,可以看看php的error_log里面的信息,或者是apache的错误信息。
2015-09-01 12:33:32
#20 lvqing
加了
register_shutdown_function("shutdown_func");
function shutdown_func(){}
打开显示错误后,
提示信息是
Notice: Undefined variable: debug in /www/web/onethink_szivan_com/public_html/protected/lib/speed.php on line 478
not a clean shutdown
后面的提示 是 shutdown_func 输出的
对应的 speed.php 函数 是
function err($msg){
$traces = debug_backtrace();
if(!$GLOBALS['debug']){
if(!empty($GLOBALS['err_handler'])){
call_user_func($GLOBALS['err_handler'], $msg, $traces);
}else{
error_log($msg);
}
}else{
if (ob_get_contents()) ob_end_clean();
function _err_highlight_code($code){if(preg_match('/\<\?(php)?[^[:graph:]]/i', $code)){return highlight_string($code, TRUE);}else{return preg_replace('/(<\?php )+/i', "", highlight_string("
function _err_getsource($file, $line){if(!(file_exists($file) && is_file($file))) {return '';}$data = file($file);$count = count($data) - 1;$start = $line - 5;if ($start < 1) {$start = 1;}$end = $line + 5;if ($end > $count) {$end = $count + 1;}$returns = array();for($i = $start; $i <= $end; $i++) {if($i == $line){$returns[] = "
".$i.". "._err_highlight_code($data[$i - 1], TRUE)."
";}else{$returns[] = $i.". "._err_highlight_code($data[$i - 1], TRUE);>return $returns;
}
指向的语句是 if(!$GLOBALS['debug']){
这个环境超级神奇,$GLOBALS['debug'] 居然报错!
2015-09-01 13:40:25
#22 lvqing
谢谢,我试试。
前面所用的域名是 本地 host 指向的,不是实际解析的域名,与这个有关么?
如果 域名 直接用 ip 地址代替,是否可以?
2015-09-01 14:46:36
#23 lvqing
config.php 直接用 j大 给的,
然后改了 speed.php
$clean = false;
function shutdown_func(){
global $clean;
if (!$clean){
die("not a clean shutdown");
}
return false;
}
register_shutdown_function("shutdown_func");
define('SPEED_VER', '0.1');
set_error_handler("_err_handle");
defined('DS') or define('DS', DIRECTORY_SEPARATOR);
var_dump (file_exists(APP_DIR.DS.'protected'.DS.'config.php'));
$GLOBALS = require(APP_DIR.DS.'protected'.DS.'config.php');
var_dump (isset($GLOBALS['rewrite']));
var_dump (isset($GLOBALS['mysql']));
var_dump (isset($GLOBALS['debug']));
文件最后加
$clean = true;
执行结果
bool(true) bool(false) bool(false) bool(false) not a clean shutdown
配置文件存在,
$GLOBALS = require(APP_DIR.DS.'protected'.DS.'config.php');
测试 rewrite、mysql、debug 是否存在时都是 不存在,
就是 配置参数 没有进去。
2015-09-01 15:18:57
#24 jake
哎~~~看来你改的不少东西。
或者这样吧,简单的弄个本地的xampp,然后直接用GIT的代码,就应该什么都OK的。
2015-09-01 15:43:25
#25 lvqing
改那堆是为了查问题,实际运行是不会这样改,我服了这个服务器环境,不折腾了,这个问题是特例;
其他环境试过,标准的配置文件也没问题的.
2015-09-01 16:12:30
#27 jake
别用 $cfg = array(
直接用return array(
就可以了
2015-09-08 18:21:01
#28 才周查查
温馨提醒 删除点击百照
周小姐 tel:178-757-463-87 腾讯 2044494160
2015-09-09 12:55:53
#29 jeffrey_shou
支持Jake兄,加油啊,一起测试完善SP。
2015-10-07 16:13:38
#30 bencen
@jake 我觉得speedphp
$GLOBALS = require(APP_DIR.DS.'protected'.DS.'config.php');
这段,感觉最好还是不要用这个变量名。可以换个。
和本身Php全局变量同名。类,函数,想调用外部全局变量,根本就不行了。。
或者你这样做法用意何在?
2015-10-12 20:57:56
#31 jake
1. 不存在根本用不了全局变量的情况,因为$GLOBALS是个全局数组,数组的意思是谁都可以用其中一部分,但是不好用全部。
比如说mysql的配置是$GLOBALS["mysql"],如果你的程序需要,那么可以叫 $GLOBALS["mycode"],这不冲突。
2. 确实也是一个规范性的东西,一般语言不建议使用全局变量。所以SP框架是建议把全局变量作为配置,毕竟类似java之类的,也大部分只有配置是全局的。
另外,你的程序也一般不建议直接使用$GLOBALS,除非是配置。一方面是因为“语言不建议用全局变量”,另一方面也是因为“只有配置才是全局的”
2015-10-12 22:33:30
#32 citywill
作为sp老用户,偶然看到git上的动态,看到sp出新版本了,恭喜jake。
大致看了一遍代码,发现新版走更精致的路线了,而且增加了module和layout两个重要特性。喜欢。提点建议吧:
1. 新版controller和model没有重名的问题了,但model和include还是可能重名,建议引入命名空间,或者model也加后缀
2. model去掉了linker挺可惜的,这部分比较常用还不好扩展,建议加上
3. 不太明白为什么要用模板标记替代原生态然后再compile回来,这段代码是否也可以精简掉
2015-10-13 11:50:53
#33 jake
谢谢哦,顺便说一下:
1. 命名空间在新版好像是支持的,测试过了。不过PHP的命名空间实在是不怎么样,不怎么建议用它。PHP项目相对精简,所以SP给的建议是尽量一个项目别搞同样的名字的类,尤其是model和include本来存放的东西就不一样的。
2. linker纠结了很久,跟canphp的单骑兄也研究过此问题。实际上我们的结论是一个带join的SQL,比一堆关联定义+奇怪的用法,会更清晰,而且性能更好。SQL的join语法也不难,所以就这样咯。
3. 模板语法只有三四十行,实现了一个常规使用的smarty兼容,用这个有smarty的好处但比起smarty轻量级一百倍。当然,也可以不用,直接include PHP作为模板。代码没执行是不会有负担的,所以就让那几十行的代码在哪儿吧~~~
当然,直接用PHP做模板,我个人是不赞成的,毕竟PHP最令人诟病的地方就是PHP和HTML混合得太多。
2015-10-13 12:33:17
#34 冈刀飞絮
分页咋整?
2015-10-15 20:56:43
#35 冈刀飞絮
分页咋整?
2015-10-15 20:56:48
#36 jake
支持,而且比旧版更简单,不过教程没出之前,只能看代码,抱歉
2015-10-16 22:46:05
#37 冈刀飞絮
稍微下代码我理解没错的话应该是 , 直接 findAll() 里面的 limit 参数 array() 作用controller action里头:
$this->data = (new User())->findAll("", "", "*",array($pageIndex*($pageSize-1), $pageIndex*($pageSize) , $scope)) 模板:
数据: 确实比老的简单 灵活 好用 jake 大赞{:soso_e179:}
2015-10-16 23:24:22
#38 冈刀飞絮
论坛似乎有bug 我们明明写了后面一节代码没了
数据: <{foreach $data as $v}> <{$v.uid}> <{$v.username}> <{/foreach}>
分页 <{foreach $page as $p}>
<{$p->..}>..
<{/foreach}>
2015-10-16 23:27:51
#39 冈刀飞絮
jake 申请加入 教程编写 是否能给机会?
2015-10-16 23:33:59
#40 jake
首先,很欢迎,从另一帖子可以看到你的能力,所以肯定是欢迎的
不过,目前的基础教程方面我的想法是尽量风格统一,所以不考虑多人协作
当然,在基础教程之后,计划是继续往很多实践相关方向去写专题类教程,希望到时能有各位的协助
2015-10-18 00:27:49
#41 冈刀飞絮
谢谢,期待,speedphp 09年开始用,再不贡献下 用之有亏了呵呵。
2015-10-18 07:19:47
#42 passionxlife
凡是通过$this->xxx指定的模板变量,在进行调用的时候都会过滤掉html代码。看了下缓存,框架貌似在每个变量都会自动加这个echo htmlspecialchars 的函数。
有些变量不需要转义,比如友情链接、自定义底部信息(会包含hr br p 等标签),有什么办法可以解决这个问题么?@jake
2015-10-26 09:18:04
#43 jake
这是默认的安全策略:防止XSS攻击,所以会自动进行过滤。
如果变量不需要过滤,可以在后面加入nofilter标记,比如说 <{$myhtml nofilter}>这样就不会被转码了。
2015-10-26 09:47:26
#44 xzp44
希望J大加入在修改模板后自动编译的功能,现在每次修改模板后都要去手动删缓存。
2015-10-28 16:30:06
#45 jake
请问一下是旧版还是新版,不过新旧版都没有这样的问题,除非旧版情况下开启了模板缓存。
1. 新版是自动判断模板文件修改时间,如果有更新就会重新编译。具体代码在:
https://github.com/SpeedPHP/speed/blob/master/protected/lib/speed.phpL386 流程是先根据模板的filemtime(修改时间),来拼装新的编译文件的地址,然后删除原模板的编译文件,最后按新地址生成新的编译问题。
PS:filemtime在win和*nix上面都运作正常
http://cn.php.net/manual/zh/function.filemtime.php ,stats的缓存也是在同一次php执行中发现——但是修改文件并不是php执行行为,所以stats不会缓存。
http://cn.php.net/manual/zh/function.clearstatcache.php 2. 开启APC的OPCODE缓存情况下,会需要清理OPCODE才能更新内容,但是不涉及模板,模板生成还是按修改时间。
3. 旧版的默认情况下不开缓存的,默认编译的话,也是用类似监控filemtime的方式,所以也没有这样的情况。
唯一会发生修改模板后,不马上生效的情况,只有旧版用的smarty,在开启了caching选项后,会产生这样的情况。
对于caching的说明在这里:
http://www.speedphp.com/smarty/variable.caching.html 综上,新版没有用到smarty,所以可能楼上说的是旧版的情况。旧版可以关闭caching就不会有这样的问题了。
2015-10-28 17:22:45
#46 xzp44
我指的是新版,我再去研究一下。谢谢回复。
2015-10-29 10:50:57
#47 sp_lin
使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。 是不是error_reporting这个就不需要了吧
http://www.jb51.net/article/43089.htm
2015-11-11 16:36:01
#48 jake
也不算是失效,error_reporting指的是页面输出错误级别,如果用了set_error_handler,那么错误就不一定是页面输出了。所以也就不属于error_reporting可以控制的范围。
http://cn.php.net/manual/zh/function.set-error-handler.php
2015-11-12 08:09:21
#49 sp_lin
恩 是的
2015-11-12 08:49:41
#50 lnvcliuren
新版如何分页????
2015-11-16 14:14:44
#51 passionxlife
默认demo下,如何给admin分支设置layout?
controller/admin/BaseController.php
class BaseController extends Controller{ public $layout = "admin/layout.html" ; function init (){ header( "Content-type: text/html; charset=utf-8" ) ; $this -> set = $GLOBALS [ 'hb' ][ 'set' ][ 'pub' ]+ $GLOBALS [ 'hb' ][ 'set' ][ 'ht' ] ; } } controller/admin/MainController.php
class MainController extends BaseController { // 首页 function actionIndex (){ } function actionLogin (){ echo "login" ; } function actionLoged (){ echo "loged" ; } } view/admin/layout.html
html > lang= "en" > charset= "utf-8" > <{$set['title']}> href= "<{$set['public']}>css/bootstrap.min.css" rel= "stylesheet" > class= "container" > <{include file=$__template_file}>
view/admin/main_index.htmlclass= "test" > 测试内容
最终浏览器输出的,只有“view/admin/main_index.html”的内容,何故?求解!@jake
2015-11-17 11:49:14
#52 passionxlife
默认demo下,如何给admin分支设置layout?
controller/admin/BaseController.php
class BaseController extends Controller{ public $layout = "admin/layout.html" ; function init (){ header( "Content-type: text/html; charset=utf-8" ) ; $this -> set = $GLOBALS [ 'hb' ][ 'set' ][ 'pub' ]+ $GLOBALS [ 'hb' ][ 'set' ][ 'ht' ] ; } } controller/admin/MainController.php
class MainController extends BaseController { // 首页 function actionIndex (){ } function actionLogin (){ echo "login" ; } function actionLoged (){ echo "loged" ; } } view/admin/layout.html
html > lang= "en" > charset= "utf-8" > <{$set['title']}> href= "<{$set['public']}>css/bootstrap.min.css" rel= "stylesheet" > class= "container" > <{include file=$__template_file}>
view/admin/main_index.htmlclass= "test" > 测试内容
最终浏览器输出的,只有“view/admin/main_index.html”的内容,何故?求解!@jake
2015-11-17 11:49:29
#53 passionxlife
疏忽犯下错误,仔细检查代码,发现自己在入口文件放了一个检测客户端agent的文件,自动忽略了PC端的输出。{:soso_e136:}
2015-11-17 12:19:19
#54 新一
经过测试,新版 speed.php 在hhvm 环境中无法运行
2015-11-19 02:07:50
#55 jake
请问,错误提示?或者是日志等,有吗?
2015-11-19 09:15:48
#56 mu3389
Fatal error: Class 'PDO' not found in C:\InstallApp\ComsenzEXP\wwwroot\speed\protected\lib\speed.php on line 314
找不到PDO这个class
2015-11-25 10:53:09
#57 jake
你的php环境,配置一下PDO数据库类吧。php5.2开始,pdo数据库是主流了~~~
2015-11-25 11:23:25
#58 cigery
可以在
自定义的错误处理函数 _err_handle中加入一行代码如下: if(0 === error_reporting()) return; 用于跳过在程序中使用了@ 抑制报错的地方
2015-12-02 13:50:12
#59 jake
{:soso_e179:}
感谢提示,已经push到git上了。
2015-12-02 14:43:53
#60 anythink
建议数据库查询失败等相关异常不要用err函数,而是throw SpeedMysqlException一下,给开发者一个try的机会处理错误。
2015-12-03 16:34:36
#61 jake
统一收集错误,如果需要throw可以用配置 $GLOBALS['err_handler'] 设定错误处理的函数,然后在里面throw出来就好。见471行。
如果要做区分的话,最好自定义区分。框架里面做这个有点太啰嗦了。
2015-12-03 17:30:38
#62 anythink
嗯,看到自定义错误处理的函数了。
2015-12-04 13:31:47
#63 passionxlife
模板解析貌似有点BUG,模板内:
解析后浏览器呈现:
@jake
2015-12-10 00:02:03
#64 jake
这个问题待解决,
暂时只要在一行里面不出现两个<{}>而中间没有点号,就不会这样解析。
2015-12-10 08:50:39
#65 jake
已经修复,请从git更新代码
2015-12-10 14:29:48
#66 xieguolun
01.$domain = array(
02. "localhost" => array(
03. 'debug' => 1,
04. ),
则在开发时不能以127.0.0.1代替,否则出错
2015-12-26 10:59:08
#67 jake
你设置了localhost这个域名就用这个才行,这里是一一对应,要用127那个要自己加上。
另外普及一下,linux上面localhost很多时候不是127那个ip,还有一般域名对应的ip也不止一个的。
2015-12-26 13:27:52
#68 冈刀飞絮
public function update($conditions, $row){
$values = array();
foreach ($row as $k=>$v){
$values[":M_UPDATE_".$k] = $v;
$setstr[] =$k."=".":M_UPDATE_".$k;
}
改为
public function update($conditions, $row){
$values = array();
foreach ($row as $k=>$v){
$values[":M_UPDATE_".$k] = $v;
$setstr[] ='`'.$k."`=".":M_UPDATE_".$k;
}
2015-12-27 23:45:49
#69 冈刀飞絮
同上
public function create($row){
$values = array();
foreach($row as $k=>$v){
$keys[] = $k; $values[":".$k] = $v; $marks[] = ":".$k;
}
改为
public function create($row){
$values = array();
foreach($row as $k=>$v){
$keys[] = "`{$k}`"; $values[":".$k] = $v; $marks[] = ":".$k;
}
2015-12-27 23:52:12
#70 jake
我疏忽了,感谢提醒,已加入
2015-12-28 09:22:05
#71 cigery
发现 模版中两个变量之间 如果有等于号"=" 会出错
例:
<{foreach $vars as $k => $v}>
<{$k}> = <{$v}>
<{/foreach}>
2016-01-08 14:52:24
#72 cigery
看了下模板编译后的结果
两个变量变成了这样
= <{$v; ?>
2016-01-08 14:57:53
#73 jake
已经修复,感谢哦!
2016-01-08 15:29:03
#74 土蚕
模板判断中foreach没有foreachelse,希望能够加上。另外新框架不集成smarty的理由除了轻量化外,是否还有其他考虑?
原来模板基于smarty3写成,如果新框架想集成smarty3,请问最简洁的目录和配置信息应该放在哪里?
2016-01-11 10:04:16
#75 jake
foreachelse不加入的理由是:那只是一个if else,用foreachelse反而逻辑复杂了。另外的理由也是这东东实现有些繁琐。
不用smarty,有两个考虑:
1. smarty是越来越复杂,越来越重量级了。
2. 实际上我们通常开发里面,真正用到smarty的功能,不到全部smarty功能的百分之三。所以,把常用功能拿出来就好,像foreachelse,真的没几个人用,甚至很多人都不知道这东东。
新框架集成smarty的方法,可以参考旧版的controller和新版的controller对比,差不多对比一下就明白怎么集成了。
2016-01-11 10:33:55
#76 土蚕
谢谢jake的回复,刚才去知乎搜索了一下smarty,的确没有当年流行了,根据现有的框架规划,是不是在保留smarty核心功能的基础上,可以通过加入php原生代码来做模板,这样提高了效率,也更为灵活,但这样做是否违背了MVC的理念?
2016-01-11 11:02:07
#77 jake
原生PHP作为模板,实际上就是一个include代替display,也没有所谓的支持不支持——当然封装一下“看起来”会厉害点而已。
这块应该可以作为一个新版的点。但不会包含在新版模板中,新版模板的一个关键就是跟smarty一样,在模板内限定语法(换个角度说是不灵活)。这点对于模板引擎来说非常重要。
不过我自己的意见来说,不建议用原生PHP作为模板。
开发效率并没有提升多少,
执行效率跟用smarty或新版的模板引擎,是一样的。这点不用怀疑。
而且会把程序弄得非常乱,最终变得很难维护。
php一直被人诟病就是这个,我们也不好开倒车,不是吗?
2016-01-11 11:44:19
#78 cigery
还是那个 之前修复那个模板引擎中 变量间有= 出错的问题
修复后 发现 原先模板中这样使用的变量 出现不被编译的情况:
例:
<{$position_list[$v.position_id]['name']}>
未修改=出错之前 可以正常编译显示
2016-01-12 21:07:15
#79 cigery
类似这样的: <{$type_map[$v['type']]}>
<{$rating_map[$rs['rating']]}>
在页面中都变成直接显示成这样 未被PHP编译
2016-01-12 23:06:27
#80 cigery
我测试了下 之前改动的三行:'<{(\$[\S]+?)\snofilter\s*}>' => '',
'<{(\$[\S]+?)\s*=(.*?)\s*}>' => '',
'<{(\$[\S]+?)}>' => '',
只需将中间一行换成:
'<{(\$[\w\_\"\'\[\]]+?)\s*=(.*?)\s*}>' => '',
其余两个还是按之前的
这样就可以了 变量间有“=”号也不会出错, 这种数组写法 $var[$v['name']] 也不会不被编译
2016-01-13 01:20:34
#81 jake
已修复~~~谢谢哦
2016-01-13 10:07:35
#82 sp_lin
问下 新版什么时候发布,谢谢
2016-02-02 11:02:12
#83 sp_lin
同时问下 新版是否考虑过PHP7.0的兼容性 以便 跟进 PHP的性能因素
2016-02-02 11:16:02
#84 jake
新版已在github上发布,请下载使用。
新版和旧版都完美支持PHP7。
2016-02-02 16:24:02
#85 胆小鬼/aiq
如果我的站点有对应的虚拟目录,这个应该怎么处理?
目前我把speedphp放在虚拟目录下,默认首页打开无样式?
2016-02-04 12:05:46
#86 jake
可以放在虚拟目录的根目录,也可以放在相对目录。
无样式的问题,是CSS路径问题。请设置你的CSS文件路径为相对或绝对路径即可。具体可以百度一下。
2016-02-04 22:21:43
#87 dongfan
请问一下,用什么方法,可以获取当前的路径,我现在模板,不知当前的路径该怎么配置?
在view文件中,我分两个文件夹,一个是web前台模板, 一个是admin后台模板,不知如何配置这两个目录的模板,麻烦指教一下?
2016-02-26 08:24:56
#88 jake
当前路径?我大概猜有两个意思
1. 当前访问的位置,比如说在首页。这个你可以
global $__controller, $__action;
就可以用这两个变量了,分别代表了当前的控制器和action。
2. 文件当前路径,文件执行路径是 APP_DIR 这个常量,
当前文件路径是常量:__FILE__
3. view里面的目录,可以这样子
$this->display("admin/index.html")
或者
$this->display("web/index.html")
不是通过配置,而是通过程序来定模板位置。
2016-02-26 08:42:21
#89 dongfan
谢谢回复,我可能没有表述清楚,我其实想知道,一是前后台的中的web 和admin文件夹中的html文件中的那些个css ,img等文件他的路径如何写,让html正常显示出来?
2016-02-26 22:34:03
#90 jake
可以百度一下相对路径和绝对路径,稍微了解一下网页知识。
另外,也可以参考我们手册的文章
http://www.speedphp.com/thread-3748-1-1.html ,路径这样的知识是通用的。
2016-02-27 14:45:57
#91 JiaFeiX
请问可以支持 Sqlite 数据库吗? 可以直接把 SpeedPHP 的Sqlite驱动拿过来吗?
2016-02-28 23:31:39
#92 jake
驱动拿过来不能直接用,当然如果是修改,直接改model类会更简单。理论上来说sqlite只是链接方式不一样,所以改起来很容易。
2016-02-29 22:07:06
#93 505783958
什么时候出个详细的使用文档,现在都是摸瞎在用,因为自己是做手机端的, php不是很熟悉,如果有详细文档会好用很多。
2016-03-10 11:37:44
#94 jake
在写
2016-03-10 12:26:47
#95 iwang110
Fatal error: Call to undefined function arg() in E:\WWW\protected\controller\MainController.php on line 8
这句话,没定义arg() 我在测试留言板,这个是什么意思 jack!
function actionWrite(){
dump(arg());
}
dump(arg());用不了吗?
2016-04-09 16:06:16
#96 jake
下载最新的,arg是后面加入的
2016-04-11 14:53:42
#97 gonten
新版不能设置数据库前缀了么?框架文件里面也没有找到数据库前缀的相关代码
2016-04-30 23:27:24
#98 jake
不用设置,没有必要。
大部分开发情况下实际上每个应用是对应一个库的。
2016-05-01 00:26:35
#99 gonten
我自己用的话就不要设置,但是开发的程序是开源给别人用的话,最好还是照顾下一个数据库多站点的用户。如果加上麻烦么?
2016-05-01 17:14:38
#100 jake
应该不麻烦,你看看什么地方有表名的都加上,不就行了吗?
2016-05-01 20:02:08
#101 luchec
Err: Directory "/Users/LuchecChen/Project/php/framework/speed-master/protected/tmp" is not writable or readable 我放到工程里直接就是这样的提交,啥回事?
2016-05-06 09:56:28
#102 jake
luchec 发表于 2016-5-6 09:56 Err: Directory "/Users/LuchecChen/Project/php/framework/speed-master/protected/tmp" is not writable ...protected/tmp 目录要设置成可写可读。
2016-05-06 10:49:35
#103 cigery
Model层的findCount()方法,最后的返回值不用加判断,直接 return $count[0]['M_COUNTER'] 既可。
2016-05-16 23:00:30
#104 jake
PHP5.3以上有个严格模式,未确定有没有存在的变量是不能直接用的。所以要做一次判断。
这里也是为了“兼容”5.3才写的多余代码。
2016-05-17 08:38:56
#105 cigery
不是噢,这和严不严格模式没有关系,是SELECT COUNT(*) 无论查不查得到数据PDO都会返回一个二维数组,所以无需判断
2016-05-17 09:22:01
#106 jake
这只是PDO库的行为,但是“未确定存在的变量不能直接使用”,这是PHP5.3+的严格模式的规定。
不管主观上认为变量必定存在,PHP语法都是按规定来,不能改变。
我也知道这种明明知道存在还要检测的做法挺多余的,但是有什么办法,如果在5.3+出现个notice,又会被诟病成不支持xx了。
2016-05-17 09:48:23
#107 cigery
我在5.6环境下,开启严格检查,没有出现过notice,J大如果这里坚持要加判断的话,那么findAll()方法里的这行
$limit = $this -> pager( $limit [ 0 ], $limit [ 1 ], $limit [ 2 ], $total [ 0 ][ 'M_COUNTER' ]); 第4个参数也得判断噢
2016-05-17 09:56:12
#108 jake
是的,必须坚持要兼容5.3+。
findAll方法里面那个确实考虑不全,补上了,git已经提交。
2016-05-17 10:51:43
#109 lvqing
j大, 有一点小小的建议
1. 更新缓存文件时, 在 speed.php 的 函数
public function compile($tempalte_name)
里面, file_put_contents 后能否判断下缓存文件是否真的生成了,如果没有生成,报一下错
$this->_clear_compliedfile($tempalte_name);
file_put_contents($complied_file, $template_data);
return $complied_file;
改成:
$this->_clear_compliedfile($tempalte_name);
file_put_contents($complied_file, $template_data);
if(!file_exists($complied_file)) err('Err: "'.$complied_file.'" is not exists!');
return $complied_file;
算是防呆, 如果 tmp 目录权限不足的话,直接有错误信息
2. 自动加载部分, 在 speed.php 的 函数
function inner_autoload($class) 中
foreach(glob(APP_DIR.DS.'protected'.DS.$dir.DS.'*.php') as $file){
if(strtolower($file) === $lowerfile){
include $file;
return;
}
}
如果文件名数组为空, 这里会报错,
在某些环境下, 比如 wdcp 一键包, 测试结果是没有缓存文件产生, 页面直接 500 错
建议修改下
$arrFiles = glob(APP_DIR.DS.'protected'.DS.$dir.DS.'*.php');
if ($arrFiles) {
foreach($arrFiles as $file){
if(strtolower($file) === $lowerfile){
include $file;
return;
}
}
}
2016-05-26 13:59:04
#110 jake
1. 目录检查的话,在file_put_contents前面的376行,已经进行过检查,重复的检查是没必要的,
if(!is_writable($this->compile_dir) || !is_readable($this->compile_dir)) err('Err: Directory "'.$this->compile_dir.'" is not writable or readable');
考虑是用你的意见,不对目录判断,而对生成文件进行判断。 另外这里需要考虑高并发下面写入不及时的问题,做一些类似的改动! 2. 这个问题已经注意到了,原先的代码是参考了PHP官网对glob函数的例子,
http://cn.php.net/manual/zh/function.glob.php 如同你说的,多加个判断会更健壮点,稍候会改上。
感谢支持哦!!!这两个问题都很有帮助的,尤其是前面的。
2016-05-26 14:14:46
#112 lvqing
谢谢 j大! 已经下载最新版本 j大还特地提到我, 有点惶恐了, 只是一点小事, 非常感谢
2016-05-27 10:44:05
#113 xcj
刚接触sp 为什么在本地测试$this->display("guestbook.html")有效
而在项目上$this->display("guestbook.html")页面不会输出 而echo是有的
麻烦问下 这是什么原因
2016-05-30 13:57:28
#114 jake
页面输出是空白还是什么的,一般部署到服务器上空白,主要应该是因为出现500错误。
出错的原因有很多,tmp目录不能写入,这是对模板是最前提要求。
另外还有是模板本身语法不对,文件路径不对等等,因为linux是区分大小写的。
如果找不到原因,最好首先是通过最简单的例子输出,然后再慢慢加入其他的东西。
2016-05-30 14:04:49
#115 xcj
jake大大 按教程弄的 发表留言后跳转说找不到链接
2016-05-31 10:01:45
#117 xcj
按手册设置了404
localhost/admin/ad.html
这个链接会跳转404页面
localhost/admin/ad
localhost/ad.html
而这两个都不会跳转 只会原页面刷新 链接还是输入的链接
是还需要在哪里设置什么吗?
2016-06-02 10:26:20
#118 jake
404的意思是没有对应的控制器/动作,才会触发的。
如果有对应得上的就不会,所以需要看看你的路由配置。
2016-06-02 11:46:44
#119 呀哈哈
新人刚接触用框架搭建页面
在BaseController.php用了layout.html这个页面把网页的头部和底部放在里面
头部有nav 比如 首页 阅读 交流 关于我们
如果我想要实现选中当前页添加class
不用框架的话直接在php页面定义
然后在头部判断$this等于几
在框架里按照那样试了不行 现在应该怎么做
2016-06-03 09:53:10
#120 jake
1. $this是一个比较特殊的关键字,别用。
2. 新人,还是好好看看新版的入门教程,有介绍怎么传递模板参数的。
2016-06-03 10:03:49
#121 呀哈哈
嗯 当时看的时候没注意看到这个 谢谢
2016-06-03 10:31:22
#122 呀哈哈
>茶与健康 >茶禅茶道 >茶诗茶画 J大 这段代码里这部分该怎么写:dizzy:
2016-06-05 00:28:49
#123 jake
用if else吧,如果三元运算符难懂的话
2016-06-06 13:22:33
#124 呀哈哈
$this->disc = $discuss->findall(null,null,"releasetime desc","9"); 教程里说$limit和$sort结合使用这样写
但是这段代码输出不了 页面空白
直接findall()是可以输出的
2016-06-06 15:48:22
#125 jake
空白一般有报错,请检查服务器日志看看错误信息
另外注意一下,是findAll,教程里是区分大小写的
2016-06-07 07:06:03
#126 qq171223374
伪静态 求指教
今天遇到问题,
配置文件这样的 config:'mall/main-list-
--.html'=> 'mall/main/list' html : <{url c='mall/main' a='list' catid='2'}> 生成: http://www.xx.com/mall/main-list--2-.html 可是访问却跳转到首页, 然后我把 伪静态匹配的正则改了 (?\w+) 改为 (?\w*) , 能正常访问这个action。 想问下后续会不会有什么bug 还有,有没有方法能做到 <{url c='mall/main' a='list' catid='2'}>生成http://www.xx.com/mall/main-list--2.html 不要后面空的参数
2016-06-07 11:43:15
#127 cigery
去掉空值很简单噢
$urlArray[$url] = preg_replace('/<\w+>/', '', $urlArray[$url]).(!empty($_args) ? '?'.http_build_query(array_filter($_args)) : '');
这样就去掉了
2016-06-07 14:58:14
#128 阿诺
载入sp框架 spConfig.php 配置文件时,提示未定义的变量
2016-06-07 15:24:23
#129 jake
要区分一下新版和旧版,看看手册
2016-06-08 17:25:36
#130 k4917552
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
_USERAGENT_
_REFERER_
出现错误
谷歌API
contentDetails->upload->videoId
无法运行 ->upload
2016-06-08 21:28:18
#131 jake
这个跟框架没关系吧,你的问题是有两个未定义或者没定义好的变量。
另外可以wget试试api能否通。
2016-06-10 07:10:48
#132 呀哈哈
$this->kw=arg('kw'); if($this->kw){ $this->rows = $db -> findAll(["iid like :word", ":word" => "%".$this->kw."%"]); }else{ $this->rows = $db->findAll(null,"st desc, rank asc, postdt desc","*",array($page,15,8)); $this->pager = $db->page; } 想实现模糊查询 查询出来后 把kw的值传到url上 使url后缀带有&kw=4404
现在这样写哪里错了?
2016-06-15 11:21:55
#134 cigery
一些浏览器会自动encode, 造成url函数中一些参数无法正确在浏览器显示,比如url中使用了一些JS变量或者JS模板引擎变量:
haha 可以在框架第93行代码 :
$params = empty($param) ? '' : '&'.http_build_query($param); 加入一个
urldecode: $params = empty($param) ? '' : '&'.urldecode(http_build_query($param)); 以便能够在所有浏览器正确输出参数
2016-06-19 21:10:19
#135 jake
mark,我研究研究哦。好像没怎么见过这情况,什么浏览器会比较突出?
2016-06-20 11:01:10
#136 cigery
搞错了 不是浏览器原因,查了下 PHP官方的具体解释
http_build_query 函数,是根据数组产生一个urlencode之后的请求字符串. 是http_build_query 自带encode
2016-06-20 11:51:27
#137 耶有宝
来提个问题,jake帮忙看下
function actionLogin(){
$condition = array("username" => arg("username"),"password"=>arg("password"));
$users = new Model("users");
$result = $users->find($condition);
echo $result['username'];
}
用户名密码都是对的,结果username出不来,sp给出的错误也没有标题
speed.php on line 334
speed.php on line 307
speed.php on line 298
speed.php on line 218
speed.php on line 222
ViewController.php on line 6 = $result = $users->find($condition);
sql语句最终为:
SELECT * FROM jifen_user WHERE `old_username` = :old_username AND `user_mima` = :user_mima LIMIT 1
2016-06-20 23:18:11
#138 耶有宝
不好意思,原来是数据库连接没改过来
2016-06-20 23:29:39
#139 呀哈哈
第一张图是直接php页面写没用框架可以正常输出
第二张图是用新版sp写的 输出后说签名的算法错了
//签名函数 function createSign ($paramArr) { global $appSecret; $sign = $appSecret; ksort($paramArr); foreach ($paramArr as $key => $val) { if ($key != '' && $val != '') { $sign .= $key.$val; } } $sign.=$appSecret; $sign = strtoupper(md5($sign)); return $sign; } //组参函数 function createStrParam ($paramArr) { $strParam = ''; foreach ($paramArr as $key => $val) { if ($key != '' && $val != '') { $strParam .= $key.'='.urlencode($val).'&'; } } return $strParam; } 这两个函数 写在include里 并放入init()里了 测试过可以用这两个函数
第三张图是写在控制器上的代码 问题应该出在这 这段代码是直接从php文件里拿来的 麻烦帮忙看下这段代码是不是有什么地方在控制器里的写法有错
测试了一天没看出问题出在哪
2016-06-22 17:06:02
#140 jake
你输出那个$url看看是不是一样的不就得了吗?
2016-06-22 17:10:47
#141 呀哈哈
php页面和sp都输出了$url 两个页面输出的是一模一样链接问题出在 file_get_contents()这个php函数?
2016-06-22 17:24:40
#142 jake
php函数都一样的吧。
你看看淘宝文档这个返回的具体说明,是不是他们接收方需要判断来源地址或者来源IP什么的,要完全做得一模一样才行。
2016-06-22 18:01:23
#143 呀哈哈
HTML页面
<{if $rows}> <{foreach $rows as $v}> 标题:<{$v.title}>
链接:<{$v.link}>
优惠券:<{$v.couponlink}>
剩余数量:<{$nums}>
<{/foreach}> <{/if}>控制器方法
class MainController extends BaseController { function actionPro(){ $page=(int)arg("p",1); $db = new Model('pro'); $this->rows = $db->findAll(null,"rank asc","*",array($page,88,8)); foreach( $this->rows as $k => $v){ $htmlstr = get_html(iconv('UTF-8', 'gb2312', $v['couponlink'])); $start = strpos($htmlstr, ""); $ends = strpos($htmlstr, " ", $start); $this->nums = substr($htmlstr,$start, $ends-$start); } $this->pager = $db->page; $this->display("index.html"); } }想要实现
2016-06-24 16:32:26
#144 呀哈哈
还没写完就自动发出了
想要实现 HTML页面上这个<{$nums}>也根据$rows一起遍历
在控制器里应该怎么写 我现在这样写<{$nums}>输出的都是同一个
2016-06-24 16:34:57
#145 jake
php数组的基础语法最好能花点时间看看。你现在的处理是nums是字符串了,要用数组。
大概改成这样,具体可以参考php的语法数组部分
class MainController extends BaseController {
function actionPro(){
...
$nums = array();
foreach( $this->rows as $k => $v){
...
$nums[] = substr($htmlstr,$start, $ends-$start);
}
$this->nums = $nums;
...
$this->display("index.html");
}
}
2016-06-26 08:51:05
#146 想做一个懒人
findAll绑定参数的方法查询不出结果,
一、数据查找 findAll() 用法:findAll($conditions = array(), $sort = null, $fields = '*', $limit = null) 参数: $condition,数组形式,查找纪录的条件。有两种方式: 直接键对值的等于关系的AND条件,如array("cid"=>12, "score"=>100),那么指代的查询是“ WHERE cid = 12 AND score = 100 ”。 另一种是可以表示比等于和AND更为复杂的条件数组。该数组的[0]下标项,是查询的字符串条件,但是输入参数必须是绑定形式的;数组的其他键对值项,都是绑定的参数字段对应值。 这种类型比较难理解,比如说我们需要模糊查找文章title带有“php”的文章,条件是: “WHERE title like '%php%' ”。那么$condition可以设置成 findAll( array("title like '%:word%'", ":word" => 'php' ) ); 代码:
$m_loginlog=new m_loginlog; $ret=$m_loginlog->findAll(array("loginip like '%:ip%'",":ip" => '223')); dump($ret); $ret=$m_loginlog->findAll(array("loginip like '%223%'",":ip" => '223')); dump($ret); 执行结果:
Array ( ) Array ( [0] => Array ( [id] => 640 [username] => xingyt [usertype] => AGENT [logintime] => 2016-08-11 12:50:29 [loginip] => 223.104.38.93 [loginaddr] => [remark] => ) [1] => Array ( [id] => 646 [username] => xingyt [usertype] => AGENT [logintime] => 2016-08-11 14:32:16 [loginip] => 223.104.63.7 [loginaddr] => [remark] => ) )
2016-08-17 14:51:06
#148 想做一个懒人
看的是最初发布时下载的文档,新文档已经解决,谢谢
2016-08-17 15:11:18
#149 快信达
新版不支持数据验证检查了吗?在手册里面没有看到
2016-09-08 21:49:21
#150 tphpn
window下面使用PHP+Apache 端口不是默认的80,而是自定义的8080,旧版的框架都可以正常运行,但新的框架会提示,“配置域名不正确,请确认localhost:8080的配置是否存在!”,什么问题?
2016-09-19 16:17:54
#151 tphpn
已解决,加了端口号,重新打开即可
2016-09-19 16:44:06
#152 tanxiaoming1989
问
伪静态,怎么设置如下
比如频道 我以/结尾
内容页我以.html结尾。
请问怎么样才能做出这样的伪静态,求可用的例子代码。
2016-11-02 17:39:25
#153 xiaoziwuzui
问一个关于路由配置的问题
如果要把
/category_111_1.html
/category_111.html
同时配置到 main/category 方法下,要怎么样配置?
现有的url处理方法貌似无法实现这个 多个路径 指到同一个方法的需求
2017-05-31 10:13:10
#155 xiaoziwuzui
我很明显研究过手册才来问的
这样配置访问是没问题
但是使用url方法生成的时候就有问题了,
以下是截图
生成新的URL路径时,会出现只匹配到第一个的问题
2017-05-31 14:45:09
#156 jake
手册写的:越是明确指向的URL配置,越要放前面。
把规则上下换一下位置就行
2017-05-31 15:43:28
#157 oo7
新版框架报500错误,按照git上教程操作的,HTTP ERROR 500
老版框架没有问题
是有什么地方需要配置吗?
2017-09-19 22:21:02
#158 jake
500就是php出错,可以看看服务器软件的日志,里面应该会有php错误记录的。
2017-09-20 10:41:13
#159 oo7
问题已解决。感谢jake老大!
不过是什么原因我一直没搞明白,我用的是php7.0版本。
起先我一步一步跟踪到 “return $domain[$_SERVER["HTTP_HOST"]] + $config;”,
发现在这里出的问题,然后我试着挨个输出数组,开始单个数组不能输出,后来不知道怎么就可以了,然后就莫名的好了,成功输出了“
Hello World”.
2017-09-20 20:09:23
#160 xzp44
数据总数小于分页大小时,返回的分页数据为空。
解决办法:代码276行,去掉if($total > $pageSize){...}判断。
2019-04-09 23:30:18