PHP中有哪些区别die()和exit()功能有什么区别?
我认为两者都具有相同的功能,但我怀疑两者有什么不同......它是什么?
我需要一个能退出js脚本的代码,就像PHP'exit'或'die'一样.(我知道它不是最好的编程实践,但我需要它).
是的,问题出在我正在使用的库中,不,我无法修改它.我需要一个解决方法.
基本上,我正在处理一个写得很糟糕的Perl库,当遇到读取文件的某个错误条件时,它会以'die'退出.我从一个程序中调用这个例程,该程序循环遍历数千个文件,其中一些文件很糟糕.坏文件发生; 我只想让我的例程记录错误并继续前进.
如果我可以修改库,我只需更改
die "error";
Run Code Online (Sandbox Code Playgroud)
到了
print "error";return;
Run Code Online (Sandbox Code Playgroud)
, 但是我不能.有什么方法可以解决这个例程,以便坏文件不会崩溃整个过程?
关注问题:使用"eval"来解决容易崩溃的调用很有效,但是如何在该框架内设置可捕获错误的处理?来描述:
我有一个子程序调用库 - 崩溃 - 有时很多次.而不是使用eval {}在这个子例程中调用每个调用,我只是让它死掉,并在调用我的子例程的级别上使用eval {}:
my $status=eval{function($param);};
unless($status){print $@; next;}; # print error and go to next file if function() fails
Run Code Online (Sandbox Code Playgroud)
但是,我可以在函数()中捕获错误条件.在子例程和调用例程中设计错误捕获的最恰当/优雅的方法是什么,以便我获取捕获和未捕获错误的正确行为?
我希望能够捕捉die()和exit()留言.这可能吗?我希望类似的东西set_error_handler和set_exception_handler.我已经看过了,register_shutdown_function()但它似乎没有包含违规die()和exit()调用的上下文.
我认识到,die()和exit()不好的方式来处理错误.我不希望被告知不要这样做.:)我正在创建一个通用系统,并希望能够优雅地记录exit(),die()如果由于某种原因某人(不是我)决定这是一个好主意.
我对使用线程知之甚少,但我查看了php的pthreads,它看起来非常有趣,容易,或者比我想象的更容易......
我搜索了一些示例并查看了文档,但是我找不到任何真实世界的例子,说明何时使用线程实际上是有益的,它确实适用于不依赖于彼此的长任务,例如执行许多http请求或也许发送邮件.
但是写日志条目怎么样?插入数据库?(比如跟踪用户活动)从数据库中获取(我可以从线程返回数据吗?)
这会增加性能还是过多地创建线程的开销?(虽然我可以使用工作池也可以减少开销,我认为...)
任何建议或例子都非常感谢!
我有一个简单使用的用户登录/注册系统
// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));
Run Code Online (Sandbox Code Playgroud)
我最近阅读了一篇关于exit();并且die();不知道我应该使用这些内容的帖子.根据我的理解,他们让它结束PHP?那是对的吗?我能为此努力的最佳方法是什么,只需在header()之后直接添加其中一个函数; 执行我有吗?
我有AJAX,通过我的login.php/register.php阅读jQuery,这会以任何方式影响吗?
编辑:除了header();之后,我应该在哪里使用exit();或者die();函数?并且exit();更多地用于PHP,而die();更多用于Perl?
可能重复:
PHP中的die()和exit()有什么不同?
我die和它的区别完全混淆了exit.
大多数程序员都die这样使用.
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); //don't see mysql_* problem it is just example
if (!$link) {
die('Could not connect: ' . mysql_error());
}
Run Code Online (Sandbox Code Playgroud)
并使用exit这样的
$filename = '/path/to/data-file';
$file = fopen($filename, 'r')
or exit("unable to open file ($filename)");
Run Code Online (Sandbox Code Playgroud)
根据那里的功能,我认为没有任何区别,因为它们都会终止脚本的执行.
我的问题是
1)在这些例子中,我可以与出口互换模具,反之亦然吗?
2)这些也有区别.
干杯...
我一直在尝试使用Perl实用程序/模块"证明"作为一些单元测试的测试工具.单元测试比"单元"更加"系统",因为我需要将一些后台进程分解为测试的一部分,使用以下...
sub SpinupMonitor{
my $base_dir = shift;
my $config = shift;
my $pid = fork();
if($pid){
return $pid;
}else{
my $cmd = "$base_dir\/..\/bin\/monitor_real.pl -config $config -test";
close STDOUT;
exec ($cmd) or die "cannot exec test code [$cmd]\n";
}
}
sub KillMonitor{
my $pid = shift;
print "Killing monitor [$pid]\n";
kill(1,$pid);
}
Run Code Online (Sandbox Code Playgroud)
但是出于某种原因,当我让我的.t文件启动一些额外的进程时,它会导致测试工具在所有测试完成后挂在第一个.t文件的末尾,而不是转到下一个文件,或者退出如果只有一个.
起初我想知道是否可能是因为我正在杀死我的子流程并让它们不复存在.所以我补充说..
$SIG{CHLD} = \&REAPER;
sub REAPER {
my $pid = wait;
$SIG{CHLD} = \&REAPER;
}
Run Code Online (Sandbox Code Playgroud)
到代码.但这没有用.事实上,在封闭式检查中,我发现我的perl测试文件已经退出并且现在已经不存在了,并且它是证明包装器脚本没有收到它的孩子.事实上,当我在测试脚本的末尾添加了一个die()调用时,我得到了......
# Looks like your test died just after 7.
Run Code Online (Sandbox Code Playgroud)
所以我的脚本退出了,但由于某种原因,线束没有解开.
我确实确认我的子流程肯定是令我感到不安的,因为我在禁用它们的同时测试失败,线束正确退出.
我在启动可能以某种方式扰乱线束的过程的方式有什么问题吗? …
我知道我可以死,但打印出脚本名称和行号.
我喜欢做类似的事情 die 'error' if $problem;
有没有办法在不打印行号的情况下这样做?
不必使用牙箍会很好 if($problem){print 'error';exit}
当我第一次开始学习PHP时,我会编写类似于这里的查询语句:
mysql_query("SELECT * FROM `table`") or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)
达到与上述相同的效果的最佳方式是什么?
据我所知,在今天的类,函数和一般OOP的世界中,以这种方式运行一堆查询是非常低效的.我们应该采取哪些不同的做法?