Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.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脚本命令行调用之后,相同的单例实例是否可用?_Php - Fatal编程技术网

在php脚本命令行调用之后,相同的单例实例是否可用?

在php脚本命令行调用之后,相同的单例实例是否可用?,php,Php,我有一个定义了类的脚本(例如,Singleton.php)。此类实现了PHP手册中的经典单例模式: class Singleton { private static $instance; public static function getInstance() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c

我有一个定义了类的脚本(例如,Singleton.php)。此类实现了PHP手册中的经典单例模式:

 class Singleton   {
    private static $instance;

    public static function getInstance() 
    {
       if (!isset(self::$instance)) {
           $c = __CLASS__;
           self::$instance = new $c;
       }

       return self::$instance;
    }
    public function run() {
        // bunch of "thread safe" operations
    }  }

$inst = Singleton::getInstance(); 
$inst->run();

问题。如果我从命令行(“
php Singleton.php
”)调用这个脚本两次,run()方法真的是“线程安全”的吗?看来不会。我曾经模拟通过文本文件运行的单个进程,其中存储了一些标志,但似乎还有其他情况。您的想法?

单例与线程安全无关。在这里,每个进程只有一个对象实例

所以,回答您的问题:不,您的脚本不是线程安全的。php将为cli上的每个调用启动一个进程(不是线程)。两个进程都将创建类的实例,并且都将尝试编写文件


稍后写入文件的进程将获胜,并覆盖第一个进程的更改。

PHP不是线程化的,而是面向进程的。PHP的每次调用(无论是命令行还是apache实例)都是内存独立的

您的单例将仅限于该进程


(哦,你应该像
$instance=new self();
那样使用'self',而不是做
$c=\uu CLASS\uuuu;$instance=new self;
。同样的结果,不那么麻烦。如果你从命令行运行这个脚本两次(我猜是同时运行),也要确保将你的u构造()设置为私有/受保护)

,您将得到两个完全不同的进程,因此线程安全不是问题:这里没有线程