我试图做一个简单的例子,以便学习如何从父表中删除一行,并使用Doctrine2自动删除子表中的匹配行.
这是我正在使用的两个实体:
Child.php:
<?php
namespace Acme\CascadeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="child")
*/
class Child {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Father", cascade={"remove"})
*
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="father_id", referencedColumnName="id")
* })
*
* @var father
*/
private $father;
}
Run Code Online (Sandbox Code Playgroud)
Father.php
<?php
namespace Acme\CascadeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="father")
*/
class Father
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
Run Code Online (Sandbox Code Playgroud)
这些表是在数据库上正确创建的,但是没有创建On Delete Cascade选项.我究竟做错了什么?
在远程服务器中,我设置了一个post-receive hook,以便对我的存储库进行git checkout:
#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f
Run Code Online (Sandbox Code Playgroud)
但是当我从本地机器推送到服务器中的git存储库时,我收到以下错误消息:
remote: error: unable to unlink old '<file>' (Permission denied)
Run Code Online (Sandbox Code Playgroud)
这出现了很多次,几乎每个文件都有一条错误消息.
但是我有一个README.txt文件,我可以使用git更改,这是它的权限:
-rw-r--r-- 1 <serverusername> <serverusername> 2939 Aug 2 10:58 README.txt
Run Code Online (Sandbox Code Playgroud)
但是具有完全相同的所有者和相同权限的其他文件会给我这个错误.
在另一个网站的另一个本地存储库中,我将本地计算机用户名作为所有者的文件,当我推送到远程服务器时,它尊重文件的远程服务器所有者,并像魅力一样工作.
显然它似乎与权限相关的错误,但我找不到修复它的方法,有什么建议吗?
可能重复:
魔术方法是PHP的最佳实践吗?
这些都是简单的例子,但想象一下你的班级中有两个以上的属性.
什么是最佳做法?
a)使用__get和__set
class MyClass {
private $firstField;
private $secondField;
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
}
}
$myClass = new MyClass();
$myClass->firstField = "This is a foo line";
$myClass->secondField = "This is a bar line";
echo $myClass->firstField;
echo $myClass->secondField;
/* Output:
This is a foo line
This is a bar line
*/
Run Code Online (Sandbox Code Playgroud)
b)使用传统的二传手和吸气剂
class MyClass {
private $firstField; …Run Code Online (Sandbox Code Playgroud) 更新:已经修复,似乎其中一个VirtualHosts配置文件在启用站点时出错.
我有Ubuntu 11.10
当我运行命令启动apache2时:
sudo /etc/init.d/apache2 start
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
启动Web服务器apache2
apache2:无法可靠地确定服务器的完全限定域名,使用127.0.1.1 for ServerName(98)已在使用的地址:make_sock:无法绑定到地址0.0.0.0:80没有可用的侦听套接字,关闭无法打开日志操作'开始'失败.
我运行此命令以获取使用端口80的进程:
sudo netstat -ltnp | grep ':80'
Run Code Online (Sandbox Code Playgroud)
返回此输出:
tcp6 0 0 :::80 :::* LISTEN 1176/
Run Code Online (Sandbox Code Playgroud)
要知道我运行此命令的进程:
ps -wlp1176
Run Code Online (Sandbox Code Playgroud)
返回:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 D 33 1176 1 0 80 0 - 0 exit ? 00:00:00 apache2
Run Code Online (Sandbox Code Playgroud)
但如果我试图杀死这个过程:
sudo kill -9 1176
Run Code Online (Sandbox Code Playgroud)
它不会杀死它,如果我再次运行netstat命令仍然显示监听和apache启动失败.
有什么建议?
我在php.net上发现了一个关于序列化数据的有趣评论,以便将其保存到数据库中.
它说如下:
请!请!请!请勿序列化数据并将其放入数据库.Serialize可以这种方式使用,但是缺少关系数据库和数据库引擎中固有的数据类型.这样做会使数据库中的数据不可移植,难以阅读,并且会使查询复杂化.如果你希望你的应用程序可以移植到其他语言,比如说你发现你想在你的应用程序的某些部分使用Java,那么使用Java是有意义的,序列化将成为臀部的痛苦.您应始终能够查询和修改数据库中的数据,而无需使用第三方中间工具来操作要插入的数据.
我在职业生涯中遇到过这么多次,这使得难以维护代码,代码存在可移植性问题,而且数据更难以迁移到其他RDMS系统,新模式等.它还有另外的缺点根据您已序列化的某个字段搜索数据库使其变得混乱.
这并不是说serialize()没用.它不是......使用它的好地方可能是包含数据密集型操作结果的缓存文件.还有很多其他的......只是不要滥用序列化,因为下一个出现的人会有维护或迁移的噩梦.
我想知道这是否是关于将数据序列化用于数据库目的的标准视图.这意味着有时使用它是否是一种好习惯,或者是否应该避免使用它.
例如,我被指示最近自己使用序列化.
在这种情况下,我们必须保存到MySQL表中的数据如下:
Car info是一个表示版本所有属性的数组,因此它具有大量可变属性(在100个属性下).这个数组是要序列化的数组.
我为了使用序列化而给出的主要原因如下:
作为大量字段,最好序列化数据以提高性能,而不是为每个属性或多个表创建字段.
就个人而言,我更赞同php.net中的评论,而不是最后的断言,但我想在这里有更多关于此的合格意见.
使用命令:
wc -l + `find . -name \* -print`
Run Code Online (Sandbox Code Playgroud)
您可以获取文件夹中所有文件的总行数.
但是想象你有一些文件夹(例如库),你不想计算它们的行,因为你没有写它们.
那么,你如何计算项目中排除某些文件夹的行?
我正在使用vundle作为vim的插件管理器.
但是我在安装ctrlp插件时遇到问题.
当我执行时:BundleInstall ctrlp,它会输出以下日志并出现致命错误:
[131003 9时39分27秒]捆绑坚/ ctrlp
[131003 9时39分27秒] $ GIT中克隆--recursive ' https://github.com/kien/ctrlp.git '"/home/username/.vim/束/ ctrlp '[131003 9点39分27秒]>克隆到' /home/username/.vim/bundle/ctrlp'...^@fatal: https://github.com/kien/ctrlp.git/info / refs?service = git-upload-pack not found:你在服务器上运行了git update-server-info吗?^ @
[131003 09:39:28] Helptags:
[131003 09:39:28]:helptags/home /username/.vim/bundle/vundle/doc/
[131003 09:39:28]:helptags /home/username/.vim/bundle/vim-fugitive/doc/
[131003 09:39:28]:helptags/home /username/.vim/bundle/vim-colors-solarized/doc/
[131003 09:39:28]:helptags /home/username/.vim/bundle/nerdtree/doc/
[131003 09:39:28]帮助标签:4捆绑处理
[131003 09:49:39]捆绑ctrlp
[131003 09:49:39] $ git clone --recursive'https://github.com/vim-scripts/ ctrlp.git ''/
home/username..vim/bundle/ctrlp ' [131003 09:49:39]>克隆到'/home/username/.vim/bundle/ctrlp'...^@fatal:https : //github.com/vim-scripts/ctrlp.gi t/info/refs?service = git-upload-pack not found:你在服务器上运行了git update-server-info吗?^ @ [131003 09:49: 40] Helptags:
[131003 09:49:40]:helptags …
我正在尝试在路由器后面的机器中生成SSH服务器.
首先,我尝试将SSH绑定到我的公共IP地址:
ssh -R 10002:localhost:22 <ip_address>
Run Code Online (Sandbox Code Playgroud)
然后我提示密码请求,但我的用户名密码似乎不起作用.
显然我知道我的用户名密码,所以在我看来它正在尝试在同一网络下的另一台计算机上进行身份验证.
有任何建议如何解决这个问题?
当您无法访问路由器时,它还可以帮助我了解如何在路由器后面创建SSH服务器.
iptables中的端口都是开放的.
UPDATE
正如托马斯奥斯特所说,我已经尝试了以下内容.
在路由器后面的机器中,我执行了以下命令:
$ ssh -R10002:localhost:22 <remote_public_ip_address> -l <my_remote_server_username>
<remote_ip_address> 作为具有公共IP和SSH服务器的服务器的remote_ip_address,我可以完全控制它.
<my_remote_server_username> 是远程服务器用户名.
之后,我尝试从远程服务器连接到路由器后面的服务器,如下所示:
$ ssh -p 10002 <remote_public_ip_address>
但是,此命令显示以下输出:
ssh: connect to host <remote_public_ip_address> port 10002: Connection refused
Run Code Online (Sandbox Code Playgroud)
所以我使用以下命令在iptables防火墙中打开了10002端口:
sudo iptables -A INPUT -p tcp --dport 10002 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
之后,我再次执行了命令,但它显示相同的错误消息.
在路由器后面的我的机器中,我在iptables中打开了所有端口.
更新2
您必须在remove_public_ip_address服务器的/ etc/ssh/sshd_config中允许端口转发
我试图在sshd_config文件中允许portforwarding添加此命令:
LocalForward 10002 <my_remote_public_server_ip>:22
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误信息:
Bad configuration option: LocalForward
Run Code Online (Sandbox Code Playgroud)
在"ssh -R ...."之后你是否打开了窗户?
执行该命令后,它连接到远程公共机器,是的,我打开了窗口.
创建隧道后,可以在公共服务器上使用ssh -p 10002 localhost吗?
是的,如果我在公共服务器中执行该命令,它会在询问我的凭据后连接.
请在路由器后面的机器上尝试"ssh localhost",检查sshd是否正在运行.
这也有效.
更新3 …
我在我的机器上安装了Symfony2.
当我检查本地网址中的要求时:
localhost/Symfony2/web/config.php
Run Code Online (Sandbox Code Playgroud)
它说:
主要问题
在php.ini*中设置"date.timezone"设置(如Europe/Paris).
建议
在php.ini*中将short_open_tag设置为off.
在php.ini*中将magic_quotes_gpc设置为off.
- 必须在"/etc/php5/apache2/php.ini"中完成对php.ini文件的更改.
我已在内部/etc/php5/apache2/php.ini和内部进行了必要的更改/etc/php5/cli/php.ini:
date.timezone ="欧洲/马德里"
short_open_tag =关闭
magic_quotes_gpc =关闭
双方short_open_tag并magic_quotes_gpc在那里已经设置为关闭,当我检查在php.ini文件.
之后我重新启动了apache2:
sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)
但是我仍然得到相同的错误消息.
我使用Symfony 2.1.2,Ubuntu 12.04和PHP 5.3.6
更新:
如果我从浏览器运行phpinfo(),它会显示它所在的加载配置文件:
/etc/php5/apache2/php.ini
Run Code Online (Sandbox Code Playgroud)
如果我运行php -i | grep php.ini它说它所在的加载配置文件:
/etc/php5/cli/php.ini
Run Code Online (Sandbox Code Playgroud)
这些是我已经进行了更改的两个文件.
我已确保更改已保存在文件中.我也在php文件中使用了phpinfo()并在浏览器中执行它.它表示未设置date.timezone的值,并且magic_quotes_gc和short_open_tag设置为On.
如果我执行php app/check.php,需求得到解决,所以我认为/etc/php5/cli/php.ini它正常工作并且只有一个问题/etc/php5/apache2/php.ini,即与浏览器一起工作的问题.
对特定端点的POST允许上传图像,除非图像太大,所以我想在这种情况下返回适当的http状态代码响应.
在这种情况下,http状态代码400响应似乎不太合适.
400错误请求:"由于被认为是客户端错误的内容(例如,格式错误的请求语法,无效的请求消息成帧或欺骗性请求路由),服务器不能或不会处理请求.
我认为图像太大并不意味着请求格式错误或语法不正确.
有什么建议?
php ×4
symfony ×2
apache ×1
apache2 ×1
api ×1
conventions ×1
count ×1
ctrlp ×1
doctrine-orm ×1
firewall ×1
git ×1
git-checkout ×1
git-push ×1
kill ×1
nat ×1
netstat ×1
port ×1
rest ×1
ssh ×1
ssh-tunnel ×1
standards ×1
symfony-2.1 ×1
vim ×1
vim-plugin ×1
vundle ×1