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

时间:2009-09-29 14:55:17

标签: php

我有定义类的脚本(例如,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()方法是否真的“线程安全”?它似乎不会。我曾经通过文本文件模仿单进程运行,其中存储了一些标志,但似乎可能还有其他情况。你的想法?

3 个答案:

答案 0 :(得分:1)

单身人士与线程安全无关。它们每个进程只有一个对象实例。

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

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

答案 1 :(得分:1)

PHP没有线程 - 它是面向流程的。每次调用PHP(命令行或apache实例)都与内存无关。

您的单身人士只对该一个过程是唯一的。

(哦,而不是做$c=__CLASS__; $instance = new $c;你应该像$instance = new self();那样使用'self'。相同的结果,更少的烦恼。同时一定要设置你的__construct()私有/受保护的

答案 2 :(得分:0)

如果从命令行运行此脚本两次(我猜是同时发生),您将获得两个完全不同的进程,因此线程安全性不是问题:此处没有线程。