Php 我是否可以在CodeIgniter中实现新的线程?
那么,在CodeIgniter中基本上有没有一种方法可以进行异步操作呢 例如,注册后我想发送电子邮件。这往往需要一两秒钟,用户必须等待相当长的时间 那么,在CodeIgniter或PHP中有没有一种方法可以启动电子邮件的发送(或任何其他操作),并在不等待脚本结束的情况下继续执行脚本Php 我是否可以在CodeIgniter中实现新的线程?,php,codeigniter,Php,Codeigniter,那么,在CodeIgniter中基本上有没有一种方法可以进行异步操作呢 例如,注册后我想发送电子邮件。这往往需要一两秒钟,用户必须等待相当长的时间 那么,在CodeIgniter或PHP中有没有一种方法可以启动电子邮件的发送(或任何其他操作),并在不等待脚本结束的情况下继续执行脚本 我能想到的唯一一件事是,让某个cron独立于脚本执行该操作。但在脚本中有什么我可以做的吗?您还可以向消息队列添加一个条目,如rabbit mq或zero mq,这允许您稍后异步处理该消息。看看react php也会有
我能想到的唯一一件事是,让某个cron独立于脚本执行该操作。但在脚本中有什么我可以做的吗?您还可以向消息队列添加一个条目,如rabbit mq或zero mq,这允许您稍后异步处理该消息。看看react php也会有所帮助 您还可以向消息队列(如rabbit mq或zero mq)添加一个条目,这允许您稍后异步处理该消息。看看react php也会有所帮助 您还可以向消息队列(如rabbit mq或zero mq)添加一个条目,这允许您稍后异步处理该消息。看看react php也会有所帮助 您还可以向消息队列(如rabbit mq或zero mq)添加一个条目,这允许您稍后异步处理该消息。看看react php也会有所帮助 请求怎么样 您可以将请求异步发送到服务器,并根据需要触发它们。一旦函数执行并向服务器发出请求,无论用户是否离开页面,该过程都将在服务器上继续 例如:
$('#submit-btn').on( "click", function() {
function signUp(){
var email = $('#subscription').val();
var op1 = $('#option1').val();
var op2 = $('#option2').val();
var formData = new FormData();
formData.append('email', email);
formData.append('option_1', op1);
formData.append('option_2', op2);
$.ajax({
url: '/subscribe',
data: formData,
processData: false,
contentType: false,
type: 'POST'
});
});
请求怎么样
您可以将请求异步发送到服务器,并根据需要触发它们。一旦函数执行并向服务器发出请求,无论用户是否离开页面,该过程都将在服务器上继续
例如:
$('#submit-btn').on( "click", function() {
function signUp(){
var email = $('#subscription').val();
var op1 = $('#option1').val();
var op2 = $('#option2').val();
var formData = new FormData();
formData.append('email', email);
formData.append('option_1', op1);
formData.append('option_2', op2);
$.ajax({
url: '/subscribe',
data: formData,
processData: false,
contentType: false,
type: 'POST'
});
});
请求怎么样
您可以将请求异步发送到服务器,并根据需要触发它们。一旦函数执行并向服务器发出请求,无论用户是否离开页面,该过程都将在服务器上继续
例如:
$('#submit-btn').on( "click", function() {
function signUp(){
var email = $('#subscription').val();
var op1 = $('#option1').val();
var op2 = $('#option2').val();
var formData = new FormData();
formData.append('email', email);
formData.append('option_1', op1);
formData.append('option_2', op2);
$.ajax({
url: '/subscribe',
data: formData,
processData: false,
contentType: false,
type: 'POST'
});
});
请求怎么样
您可以将请求异步发送到服务器,并根据需要触发它们。一旦函数执行并向服务器发出请求,无论用户是否离开页面,该过程都将在服务器上继续
例如:
$('#submit-btn').on( "click", function() {
function signUp(){
var email = $('#subscription').val();
var op1 = $('#option1').val();
var op2 = $('#option2').val();
var formData = new FormData();
formData.append('email', email);
formData.append('option_1', op1);
formData.append('option_2', op2);
$.ajax({
url: '/subscribe',
data: formData,
processData: false,
contentType: false,
type: 'POST'
});
});
这就是我在CI中所做的 创建index.php的副本,将其移动到webroot之上,即在浏览器中无法访问的位置。在这个索引文件中,它说的是
defaultcontroller
添加这一行
$routing['controller'] = 'cli';
这将锁定或囚禁index.php文件,使其仅在控制器中使用cli.php
文件,这样web用户就无法启动此控制器方法。出于安全原因,这一点很重要。还有其他一些好处,它为您的后台脚本在CI中提供了一个单独的环境。例如,您可以设置defined('ENVIRONMENT')
站点的独立部分,等等
在cli.php
中添加如下内容
/**
*
* <pre>
* <b>Windows</b>
* php -f "{path to index}/index.php" "[arg1]/[arg2]"
* <b>Linux</b>
* /usr/bin/php -f "{path to index}/index.php" "[arg1]/[arg2]"
*/
public function index(){
echo __METHOD__ . "/n";
print_r(func_get_args());
}
php -f "{path to index}/index.php" "[method]/[arg2]"
$BG = new BgProcess("{path to index }index.php, $method, $arg1 .. etc );
这样说吧
/**
*
* <pre>
* <b>Windows</b>
* php -f "{path to index}/index.php" "[arg1]/[arg2]"
* <b>Linux</b>
* /usr/bin/php -f "{path to index}/index.php" "[arg1]/[arg2]"
*/
public function index(){
echo __METHOD__ . "/n";
print_r(func_get_args());
}
php -f "{path to index}/index.php" "[method]/[arg2]"
$BG = new BgProcess("{path to index }index.php, $method, $arg1 .. etc );
像通常在控制器中一样,将代码添加到cli。如果不使用index方法,请这样调用它
基本上,当您使用命令行或BgProcess类调用它时,它就像普通的CI类一样路由,因为您在命令行界面中运行,所以在$\u服务器
变量和其他方面存在一些差异。但这是“正确”的方法
这是从我的设置剥离下来,所以不确定它会立即工作,但它应该让你开始。RabbitMq在您只需要一个后台进程时,这有点过分了。顺便说一下,这只是我RabbitMq设置的一小部分。如果你需要一个成熟的排队系统,Rabbit是很棒的,但是它的安装和使用什么客户端的学习曲线等等
请注意,您需要能够在php中使用run
或exec
命令。另外,永远不要将用户输入放在shell命令的参数中,这是将索引文件移出web可访问位置的主要原因。仅使用正确验证的输入调用此函数。我确实有escapeshellarg
来清理输入,但我不会只依靠它
顺便说一下,为了在windows上运行正确的后台进程,这是值得研究的几天
正如其他人提到的,使用Ajax可以更轻松地完成,但是使用httpd服务器会带来额外的开销。这类似于使用cron运行它,但不使用cron。如果您熟悉这一点,那么命令行调用应该与cron调用非常相似,除非您使用curl来表示恶心的
干杯 这就是我在CI中所做的
创建index.php的副本,将其移动到webroot之上,即在浏览器中无法访问的位置。在这个索引文件中,它说的是defaultcontroller
添加这一行
$routing['controller'] = 'cli';
这将锁定或囚禁index.php文件,使其仅在控制器中使用cli.php
文件,这样web用户就无法启动此控制器方法。出于安全原因,这一点很重要。还有其他一些好处,它为您的后台脚本在CI中提供了一个单独的环境。例如,您可以设置defined('ENVIRONMENT')
站点的独立部分,等等
在cli.php
中添加如下内容
/**
*
* <pre>
* <b>Windows</b>
* php -f "{path to index}/index.php" "[arg1]/[arg2]"
* <b>Linux</b>
* /usr/bin/php -f "{path to index}/index.php" "[arg1]/[arg2]"
*/
public function index(){
echo __METHOD__ . "/n";
print_r(func_get_args());
}
php -f "{path to index}/index.php" "[method]/[arg2]"
$BG = new BgProcess("{path to index }index.php, $method, $arg1 .. etc );
这样说吧
/**
*
* <pre>
* <b>Windows</b>
* php -f "{path to index}/index.php" "[arg1]/[arg2]"
* <b>Linux</b>
* /usr/bin/php -f "{path to index}/index.php" "[arg1]/[arg2]"
*/
public function index(){
echo __METHOD__ . "/n";
print_r(func_get_args());
}
php -f "{path to index}/index.php" "[method]/[arg2]"
$BG = new BgProcess("{path to index }index.php, $method, $arg1 .. etc );
像通常在控制器中一样,将代码添加到cli。如果不使用index方法,请这样调用它
基本上,当您使用命令行或BgProcess类调用它时,它会像正常情况一样路由