如何计算PHP脚本(linux)中的处理器核心数?

时间:2016-05-01 18:20:51

标签: php linux pthreads

我正在尝试使用pthreads进行多线程处理。我正在用构造函数创建池。第一个参数是Workers的数量。

$pool = new Pool(8, 'WebWorker');

我想自动检测处理器核心数。像这样:

$pool = new Pool(get_processor_cores_number(), 'WebWorker');

PHP怎么可能?

6 个答案:

答案 0 :(得分:6)

你可以做类似的事情,当然你的服务器应该在linux中:

function get_processor_cores_number() {
    $command = "cat /proc/cpuinfo | grep processor | wc -l";

    return  (int) shell_exec($command);
}

您将执行shell命令,然后将其强制转换为int。

答案 1 :(得分:4)

这是一个公开sysconf的扩展:krakjoe/sysconf

<?php
$cpusConfigured = sysconf(SYSCONF_NPROCESSORS_CONF);
$cpusOnline     = sysconf(SYSCONF_NPROCESSORS_ONLN);
?>

大多数应用程序只关心配置的数字。

答案 2 :(得分:3)

如果服务器是Linux机器,您可以使用以下代码段执行此操作:

$ncpu = 1;

if(is_file('/proc/cpuinfo')) {
    $cpuinfo = file_get_contents('/proc/cpuinfo');
    preg_match_all('/^processor/m', $cpuinfo, $matches);
    $ncpu = count($matches[0]);
}

答案 3 :(得分:2)

在我自己的库中,除其他外,我还有一个函数。您可以在使用非标准PHP函数的地方轻松对其进行修改。

例如,我缓存了结果,因此您可以忽略它。然后,我具有一些功能来检查我们是否在Linux,Mac或Windows上运行。您可以在此处插入自己的类似支票。为了执行特定于系统的实际检查,我使用了自己的Process类,该类允许诸如在后续请求中重新连接到正在运行的进程以检查状态,输出等。但是您可以更改它,而只需使用exec

public static function getNumberOfLogicalCPUCores() {
    $numCores = CacheManager::getInstance()->fetch('System_NumberOfLogicalCPUCores');
    if(!$numCores) {
        if(System::isLinux() || System::isMac()) {
            $getNumCoresProcess = new Process("grep -c ^processor /proc/cpuinfo");
            $getNumCoresProcess->executeAndWait();
            $numCores = (int)$getNumCoresProcess->getStdOut();
        }
        else if(System::isWindows()) {
            // Extract system information
            $getNumCoresProcess = new Process("wmic computersystem get NumberOfLogicalProcessors");
            $getNumCoresProcess->executeAndWait();
            $output = $getNumCoresProcess->getStdOut();
            // Lazy way to avoid doing a regular expression since there is only one integer in the output on line 2. 
            // Since line 1 is only text "NumberOfLogicalProcessors" that will equal 0.
            // Thus, 0 + CORE_COUNT, which equals CORE_COUNT, will be retrieved.
            $numCores = array_sum($getNumCoresProcess->getStdOutAsArray());
        }
        else {
            // Assume one core if this is some unkown OS
            $numCores = 1;
        }
        CacheManager::getInstance()->store('System_NumberOfLogicalCPUCores', $numCores);
    }

    return $numCores;
}

答案 4 :(得分:1)

请尽可能避免使用全新的外壳,以使简单信息从操作系统中获取。这非常慢,并且在您为单个简单任务生成整个命令解释器时会占用大量内存。

这是一种在Linux或Windows上执行此操作的快捷功能,不需要生成全新的shell:

function get_total_cpu_cores() {
   return (int) ((PHP_OS_FAMILY == 'Windows')?(getenv("NUMBER_OF_PROCESSORS")+0):substr_count(file_get_contents("/proc/cpuinfo"),"processor"));
}

这将适用于任何半现代的Windows安装(从LEAST Windows 95开始),并且将在大多数(如果不是全部)Linux风格上运行,前提是您有权读取/ proc / cpuinfo。但是大多数安装都使这个世界易于阅读...因此应该没有任何问题。

从技术上要记住的另外一点是,这是向您展示OS所见的可用CPU内核。 Windows和Linux都将超线程CPU线程视为核心,即使它们不是物理核心。也就是说,除非您确实需要知道计算机上的物理内核数量,否则这仍然可以满足您的尝试。然后,您便需要进行更复杂的过程。

希望这会有所帮助!

答案 5 :(得分:0)

如果任何人想要一种简单的功能来获得 Windows Linux 两种操作系统的总CPU内核。

/.bashrd