我是PHP的新手,所以我想知道你是否可以向我解释一下.
我正在尝试编写一个将附加到日志文件的类.我编写了这个类,以便资源本身在Logger类中是静态的.这对我来说非常适合我测试,因为我可以让多个类实例化一个Logger对象但是所有人都将共享相同的静态资源来写入该文件.
也就是说,我现在面临的问题是PHP的多个实例(多个用户加载我的页面),更具体地说:并发.
问题:
当我的网站遇到使用记录器的并发php实例时,他们是否会争取访问此文件?
我在UBUNTU,但这会在Windows中产生影响吗?
在我的记录器文件中,我检查每X行添加的行数以查看文件的大小,如果大小大于Y,我关闭此文件并"旋转"文件(mylog.log2变为mylog.log3, mylog.log1变为mylog.log2,mylog.log变为mylog.log1)并创建一个全新的mylog.log文件.如果多个实例正在写它,这会引起关注吗?如果是这样,怎么能正确处理?
抱歉新问题......
尝试关闭mysqli连接时,我收到此警告“尚未允许属性访问”。为什么?
$mysqli = new mysqli ( $database ["dbUri"], $database ["dbUserName"], $database ["dbPassword"], $database ["dbSchema"], $database ["dbPort"] );
$mysqli->autocommit(FALSE);
$con = $mysqli;
$rowsAffected = /* completes insert using $con */;
if ($rowsAffected==0) {
throw new Exception("Insert of new record failed");
}
$insertId = $con->insert_id;
$con->commit();
$con->close();
Run Code Online (Sandbox Code Playgroud)
顺便说一句,插入成功,并且我在$ insertId中具有正确的值。提交工作也很好,但是触发警告的是关闭。
我隐藏了本/* completes insert using $con */节中的代码,因为它又长又不相关(sql可以正常工作)。因此,除非您认为这是相关的,否则我仅包括其余部分。
我看过类似的问题,但其他帖子提到未建立连接。但是,我的连接有效。请查看有关“插入成功”的要点。
希望有人能在这里给我一些见解.
当必须一次向表中插入多行时,我使用的sql看起来像这样:
INSERT INTO some_names (firstName, lastName) VALUES ('Joe', 'Smith'),('Fred','Sampson'),('Lisa','Pearce')
正如您所看到的,我正在插入三行一个语句.我这样做的原因是我认为它比执行三个不同的语句来插入行更有效.
所以我的问题是:如果我希望能够将我的值绑定到语句,我该怎么做?不幸的是,我一直在寻找网络,我只能找到以下形式的单一陈述的例子:
$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?)");
$stmt->bind_param('ss', $firstName, $lastName);
$firstName = "Joe";
$lastName = "Smith";
$stmt->execute();
$firstName = "Fred";
$lastName = "Sampson";
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
看起来这相当于执行单独的INSERT语句并且似乎效率较低.
所以我的问题是:有没有办法在多插入语句中绑定?请教我这里!谢谢
如何添加到我正在使用的数组foreach?
例如:
$t =array('item');
$c = 1;
foreach ($t as $item) {
echo '--> '.$item.$c;
if ($c < 10) {
array_push($t,'anotheritem');
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎只产生一个值('item1').它似乎$t只被评估一次(在第一次foreach使用时),而不是在它进入循环后.
我已经看过许多帖子,解释了Select FOR UPDATE的用法以及如何锁定行,但是我无法找到任何解释当代码尝试读取被锁定的行时发生的情况.
例如.假设我使用以下内容:
$con->autocommit(FALSE);
$ps = $con->prepare( "SELECT 1 FROM event WHERE row_id = 100 FOR UPDATE");
$ps->execute();
...
//do something if lock successful
...
$mysqli->commit();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我如何确定我的锁是否成功?行已被锁定时处理场景的最佳方法是什么?
对不起,如果在某处描述,但我似乎找到的只是"快乐路径"的解释.
我正在尝试简化一些代码。我发现,如果您在 if 语句中分配一个值,但该值最终为 null,则计算出的 if 为 FALSE。
例子:
if($myvar = doSomething()) {
echo '$myvar = '.$myvar;
}
else {
echo "was null";
}
function doSomething() {
$a = null;
return $a;
}
Run Code Online (Sandbox Code Playgroud)
上面的脚本将显示“was null”。然而,如果$a = 1,那么它将显示“myvar = 1”。
我试图找到一些有关此行为的文档,但没有成功。我所有的资料来源都很接近,但没有很好地描述。
我的问题:这是预期的行为吗?如果 doSomething() 返回 null,我正在做的事情相当于吗if(null) {...?
编辑:是的,我的意思是 if 语句中的“=”而不是“==”。我要问的是,预计这应该始终返回 false:if($a = null)而这返回 trueif($a = 1)
php ×6
mysqli ×3
mysql ×2
array-push ×1
concurrency ×1
foreach ×1
if-statement ×1
innodb ×1
instance ×1
null ×1
rowlocking ×1
warnings ×1