我正在尝试使用pthreads进行多线程处理。我正在用构造函数创建池。第一个参数是Workers的数量。
$pool = new Pool(8, 'WebWorker');
我想自动检测处理器核心数。像这样:
$pool = new Pool(get_processor_cores_number(), 'WebWorker');
PHP怎么可能?
答案 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