Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我是否可以在CodeIgniter中实现新的线程?_Php_Codeigniter - Fatal编程技术网

Php 我是否可以在CodeIgniter中实现新的线程?

Php 我是否可以在CodeIgniter中实现新的线程?,php,codeigniter,Php,Codeigniter,那么,在CodeIgniter中基本上有没有一种方法可以进行异步操作呢 例如,注册后我想发送电子邮件。这往往需要一两秒钟,用户必须等待相当长的时间 那么,在CodeIgniter或PHP中有没有一种方法可以启动电子邮件的发送(或任何其他操作),并在不等待脚本结束的情况下继续执行脚本 我能想到的唯一一件事是,让某个cron独立于脚本执行该操作。但在脚本中有什么我可以做的吗?您还可以向消息队列添加一个条目,如rabbit mq或zero mq,这允许您稍后异步处理该消息。看看react php也会有

那么,在CodeIgniter中基本上有没有一种方法可以进行异步操作呢

例如,注册后我想发送电子邮件。这往往需要一两秒钟,用户必须等待相当长的时间

那么,在CodeIgniter或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类调用它时,它会像正常情况一样路由