访问新Bundle报错
1
2
3(1/1) ClassNotFoundException
Attempted to load class "AppBundle" from namespace "Bundles\AppBundle".
Did you forget a "use" statement for another namespace?打开 composer.json 文件,修改如下:
1
2
3
4
5
6"autoload": {
"psr-4": {
"": "src/"
},
"classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
}修改后运行
composer dump-autoload
生成实体类报错
1
2[RuntimeException]
Namespace "Bundles\CommonBundle" does not contain any mapped entities.打开 config.yml, 配置 doctrine, 添加 mappings
orm: mappings: CommonBundle: ~ #CommonBundle: # type: yml # dir: Resources/config/doctrine
Symfony3 常用命令
Bundle
1 | #生成Bundle,配置格式选择 yml |
Doctrine
1 | #Doctrine 自检数据库并生成相应的元数据文件 |
生成元数据文件后,并未生成 repositoryClass
参数,方法如下(修改后重新生成元数据文件即可):1
2
3
4
5
6
7// \vendor\doctrine\orm\lib\Doctrine\ORM\Tools\Export\Driver\YamlExporter.php
// exportClassMetadata 方法,添加 $metadata->customRepositoryClassName 为空的处理
if ($metadata->customRepositoryClassName) {
$array['repositoryClass'] = $metadata->customRepositoryClassName;
} else {
$array['repositoryClass'] = str_replace('\\Entity\\', '\\EntityRepository\\', $metadata->name) . 'Repository';
}
生成不带表前缀的元数据文件 vendor\doctrine\doctrine-bundle\Command\ImportMappingDoctrineCommand.php
第 137 行
Linux Crontab 实现秒级定时任务及普通用户运行crontab
crontab.sh
1 | #!/bin/sh |
生成XML的四种方式
- 使用纯粹的PHP代码生成字符串,并把这个字符串写入一个以XML为后缀的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30function create_item($titleData, $titleSize, $contentData, $pubdateData)
{
$item = "<item>\n";
$item .= "<title size=\"" . $titleSize . "\">" . $titleData . "</title>\n";
$item .= "<content>" . $contentData . "</content>\n";
$item .= "<pubdate>" . $pubdateData . "</pubdate>\n";
$item .= "</item>\n";
return $item;
}
$dataArray = [
[
'title' => 'title1',
'content' => 'content1',
'pubdate' => '2009-10-11'
],
[
'title' => 'title2',
'content' => 'content2',
'pubdate' => '2009-11-11'
]
];
$titleSize = 1;
$xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$xml .= "<article>\n";
foreach ($dataArray as $data) {
$xml .= create_item($data['title'], $titleSize, $data['content'], $data['pubdate']);
}
$xml .= "</article>\n";
echo $xml;
PHP 代码规范
基本要求
- 以标准计算机英文为蓝本,杜绝一切拼音、或拼音英文混杂的命名方式
- 纯PHP代码源文件只使用 <?php 标签,省略关闭标签 ?>
- 源文件中PHP代码的编码格式必须是无BOM的UTF-8格式
- 一个源文件只做一种类型的声明,即这个文件专门用来声明Class,那个文件专门用来设置配置信息,别混在一起写
- 使用Tab键来缩进,每个Tab键长度设置为4个空格
- 一行推荐的是最多写120个字符,多于这个字符就应该换行了
- 关键字必须小写,boolean值:true,false,null 也必须小写
- 涉及到多个数据表 更新/添加 操作时,最外层要用事务,保证数据库操作的原子性
- Model层,只做简单的数据表的查询
- 业务逻辑统一封装到 Logic层
- 控制器只做URL路由,不要当作 业务方法 调用,不能出现SQL操作语句
IP地理位置查询类(纯真IP地址库)
由于使用UTF8编码,如果使用纯真IP地址库的话,需要对返回结果进行编码转换
纯真IP地址库 http://www.cz88.net/ 安装完成后,到安装目录把 qqwry.dat 拷贝出来
SESSION 阻塞
问题
使用session过程中,在开启session后,同一浏览器执行同一程序,不同页面会被锁,不同浏览器不会出现这种情况
原因
由于PHP的Session信息是写入文件的,1个客户端占有1个session文件,因此,当 session_start 被调用的时候,该文件是被锁住的,而且是以读写模式锁住的,所以第2次调用 session_start 的时候就被阻塞了
解决
使用 session_write_close 函数(Write session data and end session),也就是写session的数据,同时关闭这个session,因此在用完session之后,调用这个函数关闭 session 文件即可解除锁定
Demo
创建 test1.php 和 test2.php 文件1
2
3
4
5
6
7
8// test1.php
<?php
date_default_timezone_set('PRC');
session_start();
$_SESSION['test1'] = date('H:i:s');
//session_write_close();
sleep(5);
echo $_SESSION['test1'];
1 | // test2.php |
先访问 test1.php 再访问 test2.php, test2.php 必须等 test1.php 执行完毕后才会执行,这时将 test1.php 的 session_write_close() 取消注释,再测试一遍,这时2个脚本就可以同时执行了