Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于 windows 的完整支持思路 #1074

Open
fromyb opened this issue Nov 25, 2024 · 3 comments
Open

关于 windows 的完整支持思路 #1074

fromyb opened this issue Nov 25, 2024 · 3 comments

Comments

@fromyb
Copy link

fromyb commented Nov 25, 2024

目前 windows 上运行 workerman 对比 linux 功能不完整的原因,
看起来主要是因为 posix, pcntl 这两个拓展提供的相应信号、进程相关函数。

能否抽离出针对操作系统的执行层来提供上述函数的统一封装,
然后将现在 Worker.php 对 posix, pcntl 的直接调用换成使用上述执行层。

这样做的好处是在各个各种操作系统都能使用完整的 workerman 特性,
同时类似 adapterman 的 fpm 兼容也可以整合到上述的执行层 cli 来完成。

@xpader
Copy link

xpader commented Nov 26, 2024

思路是可以,但是很难的,因为这些差异完全是由于内核层面的差异导致的,尤其是进程管理机制,Unix 上主要是主进程通过经典的 fork “复制”了一个子进程出来,然后再走不同的逻辑让子进程来负责不同的事。而这点在 Windows 的内核上则完全不同。

如果想实现这些东西,自己实现并不是理智的方法,目前最好还是借助于虚拟机,WSL 或者类似于 cygwin 这样的东西来实现。
如果 Workerman 自己实现,则多半需要使用完全不同的一套多进程管理机制,这些机制贯穿全框架,Windows 上为了这套机制,势必要写很大量代码来做信号和进程的不同管理。代价很大,并不值得。

另外,IO 多路复制机制用到的 event 扩展,也均不支持 Windows,即使在 Windows 上实现了兼容的进程管理,信号机制,也不具备生产价值。

@fromyb
Copy link
Author

fromyb commented Dec 4, 2024

在 swow 上看到了些资料,貌似有机会达成在 windows 上运行 “满血版 workerman”

1. 多进程相关能力

image image

2. 信号相关能力

image

3. IO 相关能力

[email protected] 里已经有基于 swow 的 EventInterface 实现

https://github.com/walkor/workerman/blob/master/src/Events/Swow.php

4. 其它特性

官方支持 windows

image

完整的场景覆盖

image

@xpader
在 workerman 现有结构基础上抽象出 Engine 层,
将 posix, pcntl 相关函数收缩到一个 ZendEngine 类,
并借助上述 swow 拓展的能力实现一个 SwowEngine 类,
windows 上运行 “满血版 workerman” 貌似就能实现了

@xpader
Copy link

xpader commented Dec 5, 2024

@fromyb Swow 是一个PHP的扩展,它做这些事是合理的,你说的 Workerman 做一个 Engine 层来适配这个,确实有可能,但我还是认为不值得:

用 Windows 多半是用来做开发,花这么大精力仅为了适配开发,就跟我前面说的要写大量代码来适配这个似乎并不值得,现在 Windows 上的 WSL 已经很成熟了,用起来很简单,而除了 Windows 其它用到的开发环境几乎全是支持 Unix 的,MacOS、Linux、FreeBSD,抽这个层仅仅是为了 Windows。

当然我不是不支持实现“满血版 workerman”,但是从 Workerman 的实现和线路来看,花太大精力实现这样一个层不太合适。
如果能有其它更简单的实现方法,或者开发一个扩展包帮助 Workerman 来实现,应该会更好。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants