Compare commits
452 Commits
Author | SHA1 | Date | |
---|---|---|---|
80bcbd085e | |||
ca65fca77d | |||
96975f8e57 | |||
729c1e8f2f | |||
e94377ebb1 | |||
769779970b | |||
2a27989a96 | |||
79430f7581 | |||
76f585a50e | |||
1bbc77967b | |||
1e4e2afe68 | |||
3caf90b0cd | |||
445acffa4c | |||
e90c068e95 | |||
c9428c300c | |||
807d9c55a4 | |||
ca167537cf | |||
8ae2031ba5 | |||
ec0ad13ad0 | |||
9988b775c9 | |||
8e24851014 | |||
c1d90cb909 | |||
4827c4a44b | |||
201554b237 | |||
e4bf6a9655 | |||
f9ea654ffc | |||
8677628850 | |||
e09b0156df | |||
41a83b1d91 | |||
a9e97b0bc9 | |||
e4e12799ef | |||
4e25fffa7d | |||
3e319cd50f | |||
595dc8c028 | |||
f7b1679e97 | |||
9f1761d68e | |||
871480d70c | |||
2b1c1c12f8 | |||
a22346ed35 | |||
e3fa34d4f9 | |||
3d225ea79f | |||
d2cd387c18 | |||
48bb782e33 | |||
9710ffa8da | |||
46408f5ee5 | |||
2c39f1db8b | |||
f20286cbd9 | |||
f1fe42e563 | |||
94abfe4b49 | |||
9778fd5c7b | |||
dba2ce5bf3 | |||
4644c1ada4 | |||
cef19243ee | |||
b319ecab59 | |||
a47b139d92 | |||
e026ecf60d | |||
3c0a4a6142 | |||
87ebb20284 | |||
d60c26c9b2 | |||
5c9c51f580 | |||
0c320074da | |||
e3ea712a99 | |||
4db478ca64 | |||
3064a07d69 | |||
f3e1b4de6f | |||
a3226b632f | |||
652878d97f | |||
032610ad5c | |||
2c2627dc9f | |||
62587bdf65 | |||
5e9dae78f5 | |||
949ba5b559 | |||
ce88f897ef | |||
fa9b51aaab | |||
b8affad5ee | |||
41e5f5b4c3 | |||
79f6a60a16 | |||
06bc4ddb9a | |||
bf728a24f0 | |||
b7cad3af62 | |||
4a3dee3c50 | |||
9d5a0ed745 | |||
b3b509409a | |||
4934f35d0b | |||
92e7418158 | |||
52ea64db40 | |||
f66e9b7340 | |||
2bf28fe247 | |||
c6e4f785bc | |||
94fe7df3bd | |||
f373621a4a | |||
5104a865fb | |||
7b10973330 | |||
bc208bddf9 | |||
321b4aaf8b | |||
b26fc3bc4b | |||
f758c5d63a | |||
c7510d778d | |||
70c5aadb7f | |||
a731f15cf7 | |||
ab4c436202 | |||
c0231690d4 | |||
988e9d3351 | |||
2f119d4332 | |||
d83c629a7b | |||
e7d98dbeae | |||
f3d5946743 | |||
7728a1125c | |||
3612351df7 | |||
8e912151fb | |||
3a2209e604 | |||
1f0b56cab6 | |||
e08d970edd | |||
32c757e711 | |||
480cdb94ae | |||
7fbcac5dc2 | |||
4edb5f5015 | |||
294f84ccb2 | |||
155b57eb9e | |||
a459f015e1 | |||
27676f13f4 | |||
b4b2d7052f | |||
6d25cf585e | |||
ba04c94c05 | |||
13447ba533 | |||
6f2e8f4b20 | |||
dc860074ef | |||
f586b8fcbe | |||
94714c3e7a | |||
904d05bdce | |||
ec30bee72b | |||
2fe3a4b7eb | |||
a7d5950aa0 | |||
e8306289ce | |||
ff61d8c52e | |||
da41673855 | |||
5bda727981 | |||
23cf575026 | |||
d3053b8fe3 | |||
7159ca8612 | |||
141c06d14b | |||
94c84aaab3 | |||
9ca16e72d5 | |||
67a00f979a | |||
1e4c45dcbd | |||
87c44f3ae3 | |||
f39732a0e6 | |||
3b78ac43d7 | |||
1f19b81530 | |||
d714d7ad4c | |||
4dce6c033e | |||
72a8a1e382 | |||
07b17f3f84 | |||
7f0f7ff3e9 | |||
c7c143c760 | |||
ee050af364 | |||
f7e2551587 | |||
cc0cc21e5f | |||
883ea05bd1 | |||
641bddfce7 | |||
2f7223fba5 | |||
3b23ce7805 | |||
a634d083a6 | |||
9a3dd2fa22 | |||
8790b30706 | |||
c42188b717 | |||
cc251686f9 | |||
6fd6241567 | |||
c8ab2e67f6 | |||
f82ab913c6 | |||
58943148fa | |||
8a46b9d374 | |||
a62ebcff92 | |||
541378f3f9 | |||
e6f1d7e834 | |||
20d19f2f92 | |||
91bc347e57 | |||
e05300b25b | |||
1ae7a20870 | |||
5594130ccd | |||
b9c7cdb3cc | |||
00b4760b85 | |||
9a35014d2a | |||
7cba25b52e | |||
c6c3996c7b | |||
03c96a1d16 | |||
a6fa4b240f | |||
7e78026d06 | |||
d5888c1c7a | |||
e40b9fe45a | |||
f5d0ad20cd | |||
0615927f2f | |||
3d1806c094 | |||
8a57557074 | |||
19f4819450 | |||
aa8309dd9a | |||
7977a4e177 | |||
51c100f6fe | |||
aebfc9dd09 | |||
f9acbd34d0 | |||
eb566bb523 | |||
528f213f17 | |||
f8e6aa988e | |||
93e841735e | |||
cb28243181 | |||
fc68e37458 | |||
ae6736102a | |||
3ef1a6e60d | |||
5e7c7bc903 | |||
94f3c1c7c5 | |||
20aad90ba9 | |||
8bd85d8354 | |||
90b068d200 | |||
943b5aa6af | |||
4bf475bae2 | |||
125b9bb198 | |||
72cbf6996d | |||
e7cc940f65 | |||
c8323a8c27 | |||
6805855f03 | |||
db101f5a66 | |||
2302d5a5ee | |||
5cfb0f452c | |||
7da20b4f20 | |||
f1b037ce26 | |||
e59347ed7f | |||
206dff289f | |||
02f579fe81 | |||
2a74b11462 | |||
371f98b875 | |||
7955c777e7 | |||
5c9b06d83b | |||
3c7bed0a9b | |||
54f83a0aed | |||
b041ca37be | |||
2b2b027317 | |||
cdbd959159 | |||
6fc613ac4c | |||
8240b676c1 | |||
cbebf75b48 | |||
40c24793f5 | |||
6a921d8e3e | |||
a3368effec | |||
7f4c6878e4 | |||
82626b7174 | |||
326e5c58e2 | |||
2848b4dcd2 | |||
a8cf6daa94 | |||
c4749673c9 | |||
20a0059f73 | |||
402e65f82d | |||
29d17b3880 | |||
7f04dd5fcb | |||
0fe9281e3c | |||
f88035b425 | |||
2b7bb3f352 | |||
c7ee4b8838 | |||
ab993efbde | |||
c6f49de70c | |||
8b79dc44d0 | |||
458b952787 | |||
67ec63212c | |||
104f3a7d8c | |||
d2304323fe | |||
76d078735c | |||
1eeba747cf | |||
64c259d804 | |||
b307251f81 | |||
bf610b6c4e | |||
518fb16f23 | |||
24ef7eacfe | |||
050c154894 | |||
18496de104 | |||
a21418a608 | |||
f9ee63ddf6 | |||
b7de54dfa7 | |||
2d0deed4fd | |||
4b1fc1a5ce | |||
227131bd7e | |||
f48a265bbf | |||
0c3b68734c | |||
7e5cbadc09 | |||
9f608439fc | |||
8b0aeef2e6 | |||
aa406434d0 | |||
4bca47a6d9 | |||
c5e8c4c4a6 | |||
85d7c8f9a3 | |||
4c7361e635 | |||
6413287606 | |||
ff8eb4fa04 | |||
6b72d4da65 | |||
b456fdc65c | |||
0e3c9a5a68 | |||
7cf8d4697f | |||
34e5a97155 | |||
ff2c2c9b69 | |||
d320c49092 | |||
966033e052 | |||
4e095a5ae5 | |||
6aff283d08 | |||
9c8da2aa1c | |||
5755d608f8 | |||
29fcc66cba | |||
3a826b7e51 | |||
2d8ad9e9bc | |||
64b3c4e9bb | |||
f3b3dcf449 | |||
0bdbc0a056 | |||
4f11f3d8d3 | |||
e1eb61859e | |||
2939a2ab28 | |||
08dcfb36f4 | |||
f8b605f749 | |||
8f1304308d | |||
7e04f8b881 | |||
9dae03a04e | |||
78c24555f7 | |||
41af058661 | |||
7c192730e1 | |||
bb56e33ee8 | |||
84902f3a42 | |||
8775e70178 | |||
de4cefd1b9 | |||
ebb04001d0 | |||
bd23f65668 | |||
22295ed55a | |||
2bd5b8f79e | |||
34e9e3f829 | |||
016f36a8fd | |||
862add8512 | |||
6dabcd7668 | |||
7b7a5e5236 | |||
a6aecff557 | |||
81ed154db1 | |||
e0b574b33d | |||
f414c723e4 | |||
f3ef1da2bf | |||
f7c716096c | |||
54630c222b | |||
1fc63e0471 | |||
127d5f4494 | |||
13ee618d5c | |||
ed1d7f8aed | |||
063a729d67 | |||
d1498eb070 | |||
7a02fb8a1a | |||
b925262620 | |||
aaa814ac9c | |||
870868bacf | |||
e149a2500e | |||
aef7d4021c | |||
a25f8c9748 | |||
050c489158 | |||
61af6e2dc0 | |||
130bf38dd9 | |||
a6c3f0ceba | |||
defb6e357a | |||
f274e9e004 | |||
a07881a987 | |||
ae9863b962 | |||
d679c7e75c | |||
47d921547f | |||
bc22129399 | |||
98fcb686bf | |||
715b674929 | |||
089ebe7b4e | |||
608525209b | |||
c7eb1d5ce5 | |||
81eb2fee90 | |||
2eea15aac2 | |||
eb664477f9 | |||
e1adcbcde6 | |||
3f14754177 | |||
b5758dfca7 | |||
2d4112708e | |||
32a44524ef | |||
26a097ed07 | |||
b0de0c04c6 | |||
5fc159ae5a | |||
f27e07fc78 | |||
9fceab3e2e | |||
67a91e1211 | |||
babb734c25 | |||
6456741880 | |||
f6d2f09b8d | |||
03fdf23f0a | |||
412b7bad5c | |||
a36487f6e0 | |||
e7e8658ea6 | |||
762527ece9 | |||
300880f3e5 | |||
78e682688b | |||
208a430066 | |||
5c92d47ff0 | |||
121a227510 | |||
f8642b21e6 | |||
b182218cad | |||
0bb3e5c173 | |||
e541dced4a | |||
04c6cef277 | |||
6d1ea4e93b | |||
4fd48baf63 | |||
1260022d51 | |||
ca72b79924 | |||
1a17a275d4 | |||
202f9ed9d1 | |||
881d863bb8 | |||
ef37876508 | |||
0c52720e55 | |||
744ec95630 | |||
69ff907f4a | |||
57c90c216f | |||
8df126a7b0 | |||
173206bed9 | |||
8fa270fd54 | |||
92509b5a84 | |||
c609022c9b | |||
bbbbe7555b | |||
f9363dd35b | |||
7be6a335df | |||
b39b4dc58b | |||
3ceded3456 | |||
6d89f94c92 | |||
ff2eff2a75 | |||
339eafd34d | |||
6115ef02de | |||
8fcaa34cbb | |||
5fa1836693 | |||
24aecb3148 | |||
25f824defd | |||
7936d14440 | |||
c3261b8873 | |||
5923be099f | |||
f92a3f545a | |||
b8e7397233 | |||
5c62f744ad | |||
70ebb2ef59 | |||
d9f4a19b92 | |||
90c8bcc0df | |||
1ef4f0bb81 | |||
0f62b1f1d0 | |||
89642de12e | |||
c6f2167c92 | |||
e8d705e228 | |||
a46602d4b4 | |||
7c3f416789 | |||
8d42e27ef6 | |||
894365488a | |||
3c6d2d74ff | |||
17efb50872 | |||
44800a03a1 |
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Something going wrong? File a bug report!
|
|
||||||
title: ''
|
|
||||||
labels: bug
|
|
||||||
assignees: nicoverbruggen
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Required information**
|
|
||||||
- Did you consult the FAQ in the README? [yes/no]
|
|
||||||
- Did you try "Fix My Valet"? [yes/no]
|
|
||||||
- OS: [e.g. macOS Monterey]
|
|
||||||
- PHP Monitor version [e.g. v5.0.1]
|
|
||||||
|
|
||||||
**Additional log**
|
|
||||||
You can help me figure out even more information by sending me your verbose log for your latest session of PHP Monitor. Logging is disabled by default.
|
|
||||||
|
|
||||||
You can start extra verbose logging by running: `touch ~/.config/phpmon/verbose` and restarting PHP Monitor. You can find the latest log in: `~/.config/phpmon/last_session.log`. Please attach it here!
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
62
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
name: 🐞 Bug report
|
||||||
|
description: Something going wrong? File a bug report!
|
||||||
|
title: "[Bug] <title>"
|
||||||
|
labels: [bug]
|
||||||
|
assignees: nicoverbruggen
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this?
|
||||||
|
description: Please search to see if an issue already exists for the bug you encountered.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Current Behavior
|
||||||
|
description: A concise description of what you're experiencing.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior
|
||||||
|
description: A concise description of what you expected to happen.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce
|
||||||
|
description: Steps to reproduce the behavior.
|
||||||
|
placeholder: |
|
||||||
|
1. Open this menu...
|
||||||
|
2. Click here...
|
||||||
|
3. Scroll to...
|
||||||
|
4. See error...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Environment
|
||||||
|
description: |
|
||||||
|
examples:
|
||||||
|
- **macOS**: (e.g. Ventura 13.3)
|
||||||
|
- **Valet**: (e.g. 4.0)
|
||||||
|
- **PHP Monitor**: (e.g. 5.8)
|
||||||
|
value: |
|
||||||
|
- macOS:
|
||||||
|
- Valet:
|
||||||
|
- PHP Monitor:
|
||||||
|
render: markdown
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Do you have a log file (or a screenshot) or any additional information?
|
||||||
|
description: |
|
||||||
|
You can start extra verbose logging by running: `touch ~/.config/phpmon/verbose` and restarting PHP Monitor.
|
||||||
|
|
||||||
|
You can find the latest log in: `~/.config/phpmon/last_session.log`. Please attach it here!
|
||||||
|
|
||||||
|
(You can attach images or log files by clicking this area to highlight it and then dragging files in.)
|
||||||
|
validations:
|
||||||
|
required: false
|
22
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an enhancement.
|
|
||||||
title: ''
|
|
||||||
labels: enhancement
|
|
||||||
assignees: nicoverbruggen
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
_Enhancement requests that are not immediately approved will be moved to a discussion instead._
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
31
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
name: 😎 Feature request
|
||||||
|
description: Do you have a great idea for an enhancement that could improve PHP Monitor?
|
||||||
|
title: "[Feature] <title>"
|
||||||
|
labels: [enhancement]
|
||||||
|
assignees: nicoverbruggen
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this?
|
||||||
|
description: Please search to see if an issue already exists for the bug you encountered. Please make sure you've checked the discussions tab as well. Enhancement requests that are not immediately approved will be moved to a discussion instead, so you will find some there.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues and discussions
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Is this feature request related to a problem?
|
||||||
|
description: "A clear and concise description of what the problem is. For example: 'I am always frustrated when...'"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the solution you'd like to see
|
||||||
|
description: What would be a user-friendly way of resolving this particular issue?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional information or context
|
||||||
|
description: Add any other context or screenshots about the feature request here.
|
||||||
|
validations:
|
||||||
|
required: false
|
4
.gitignore
vendored
@ -1,6 +1,4 @@
|
|||||||
phpmon.xcodeproj/project.xcworkspace
|
|
||||||
phpmon.xcodeproj/xcuserdata
|
|
||||||
PHP Monitor.xcodeproj/project.xcworkspace
|
PHP Monitor.xcodeproj/project.xcworkspace
|
||||||
PHP Monitor.xcodeproj/xcuserdata
|
PHP Monitor.xcodeproj/xcuserdata
|
||||||
phpmon-updater/PHP Monitor Self-Updater.app
|
|
||||||
.DS_Store
|
.DS_Store
|
24
DEVELOPER.md
@ -14,6 +14,17 @@ It also automatically runs when you try to build the project. You'll get a warni
|
|||||||
swiftlint --fix
|
swiftlint --fix
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 📦 Swift Packages
|
||||||
|
|
||||||
|
Starting from PHP Monitor 7.1, the app now uses various first-party package dependencies.
|
||||||
|
|
||||||
|
The following package dependencies are in use:
|
||||||
|
|
||||||
|
* [`NVAppUpdater`](https://github.com/nicoverbruggen/NVAppUpdater)
|
||||||
|
* [`NVAlert`](https://github.com/nicoverbruggen/NVAlert)
|
||||||
|
|
||||||
|
You may need an internet connection to download these dependencies, or you can also clone the dependencies and include them manually.
|
||||||
|
|
||||||
## ⚙️ Preferences
|
## ⚙️ Preferences
|
||||||
|
|
||||||
You can find the persisted configuration file in `~/Library/Preferences/com.nicoverbruggen.phpmon.plist`
|
You can find the persisted configuration file in `~/Library/Preferences/com.nicoverbruggen.phpmon.plist`
|
||||||
@ -28,15 +39,24 @@ defaults delete com.nicoverbruggen.phpmon && killall cfprefsd
|
|||||||
|
|
||||||
<img src="./docs/build.png" width="404px" alt="build button in Xcode"/>
|
<img src="./docs/build.png" width="404px" alt="build button in Xcode"/>
|
||||||
|
|
||||||
|
### PHP Monitor
|
||||||
|
|
||||||
If you'd like to build PHP Monitor yourself, you need:
|
If you'd like to build PHP Monitor yourself, you need:
|
||||||
|
|
||||||
* Xcode (usually the latest version)
|
* Xcode (usually the latest version)
|
||||||
* The contents of this repository
|
|
||||||
|
|
||||||
Once you have downloaded this repository, open `PHP Monitor.xcodeproj`, and you should be able to immediately build the app for your system by pressing Cmd-R. This will create a debug build. (If Xcode complains about code signing, you can turn it off.)
|
Once you have downloaded this repository, open `PHP Monitor.xcodeproj`, and you should be able to build the app for your system by pressing Cmd-R. This will create a debug build. (If Xcode complains about code signing, you can turn it off.)
|
||||||
|
|
||||||
|
**Important**: The updater now gets automatically built and included as part of the main target.
|
||||||
|
|
||||||
If you'd like to create a production build, choose "Any Mac" as the target and select Product > Archive.
|
If you'd like to create a production build, choose "Any Mac" as the target and select Product > Archive.
|
||||||
|
|
||||||
|
## ✅ Testing
|
||||||
|
|
||||||
|
In order to properly test everything, you will want to use the _PHP Monitor DEV_ target. There are unit and UI tests both.
|
||||||
|
|
||||||
|
You may sporadically see failures in UI tests due to the following error: `Invalid parameter not satisfying: point.x != INFINITY && point.y != INFINITY`. This seems to be an issue with Xcode that Apple may need to resolve? You can retry the tests in question and they should eventually pass.
|
||||||
|
|
||||||
## 🚀 Release procedure
|
## 🚀 Release procedure
|
||||||
|
|
||||||
1. Merge into `main`
|
1. Merge into `main`
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1320"
|
LastUpgradeVersion = "1640"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
@ -97,6 +97,10 @@
|
|||||||
argument = "--configuration:~/.phpmon_fconf_working.json"
|
argument = "--configuration:~/.phpmon_fconf_working.json"
|
||||||
isEnabled = "NO">
|
isEnabled = "NO">
|
||||||
</CommandLineArgument>
|
</CommandLineArgument>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "--configuration:~/.phpmon_fconf_working_no_valet.json"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
<CommandLineArgument
|
<CommandLineArgument
|
||||||
argument = "--configuration:~/.phpmon_fconf_broken.json"
|
argument = "--configuration:~/.phpmon_fconf_broken.json"
|
||||||
isEnabled = "NO">
|
isEnabled = "NO">
|
||||||
|
@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1640"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C41C1B3222B0097F00E7CF16"
|
||||||
|
BuildableName = "PHP Monitor.app"
|
||||||
|
BlueprintName = "PHP Monitor"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug.EA"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
codeCoverageEnabled = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO"
|
||||||
|
parallelizable = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C4F7807825D7F84B000DBC97"
|
||||||
|
BuildableName = "Unit Tests.xctest"
|
||||||
|
BlueprintName = "Unit Tests"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO"
|
||||||
|
parallelizable = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C471E7BB28F9B90F0021E251"
|
||||||
|
BuildableName = "UI Tests.xctest"
|
||||||
|
BlueprintName = "UI Tests"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C471E7AC28F9B4940021E251"
|
||||||
|
BuildableName = "Feature Tests.xctest"
|
||||||
|
BlueprintName = "Feature Tests"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug.EA"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
enableGPUValidationMode = "1"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C41C1B3222B0097F00E7CF16"
|
||||||
|
BuildableName = "PHP Monitor.app"
|
||||||
|
BlueprintName = "PHP Monitor"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
<CommandLineArguments>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "--v"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "--cli"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "--configuration:~/.phpmon_fconf_working.json"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "--configuration:~/.phpmon_fconf_working_no_valet.json"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "--configuration:~/.phpmon_fconf_broken.json"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
|
</CommandLineArguments>
|
||||||
|
<EnvironmentVariables>
|
||||||
|
<EnvironmentVariable
|
||||||
|
key = "EXTREME_DOCTOR_MODE"
|
||||||
|
value = ""
|
||||||
|
isEnabled = "NO">
|
||||||
|
</EnvironmentVariable>
|
||||||
|
<EnvironmentVariable
|
||||||
|
key = "PAINT_PHPMON_SWIFTUI_VIEWS"
|
||||||
|
value = ""
|
||||||
|
isEnabled = "NO">
|
||||||
|
</EnvironmentVariable>
|
||||||
|
</EnvironmentVariables>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release.EA"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C41C1B3222B0097F00E7CF16"
|
||||||
|
BuildableName = "PHP Monitor.app"
|
||||||
|
BlueprintName = "PHP Monitor"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug.EA">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release.EA"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
@ -0,0 +1,78 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1640"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C406A5EF298AD2CE00B5B85A"
|
||||||
|
BuildableName = "PHP Monitor Self-Updater.app"
|
||||||
|
BlueprintName = "PHP Monitor Self-Updater"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C406A5EF298AD2CE00B5B85A"
|
||||||
|
BuildableName = "PHP Monitor Self-Updater.app"
|
||||||
|
BlueprintName = "PHP Monitor Self-Updater"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C406A5EF298AD2CE00B5B85A"
|
||||||
|
BuildableName = "PHP Monitor Self-Updater.app"
|
||||||
|
BlueprintName = "PHP Monitor Self-Updater"
|
||||||
|
ReferencedContainer = "container:PHP Monitor.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1400"
|
LastUpgradeVersion = "1640"
|
||||||
version = "1.7">
|
version = "1.7">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1400"
|
LastUpgradeVersion = "1640"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
115
README.md
@ -1,19 +1,17 @@
|
|||||||
> **Note**
|
> **Note**
|
||||||
> If this software has been useful to you, I ask that you **please star the repository**, that way I know that the software is being used. Also, please consider [sponsoring](https://nicoverbruggen.be/sponsor) to support the project, as this is something I make in my free time. **Thank you!** ⭐️
|
> If this software has been useful to you, I ask that you **please star the repository**, that way I know that the software is being used. Also, please consider [sponsoring](https://nicoverbruggen.be/sponsor) to support the project, as this is something I make in my free time. **Thank you!** ⭐️
|
||||||
|
|
||||||
<p align="center"><img src="./docs/logo.png" alt="PHP Monitor Logo" width="500px" /></p>
|
<p align="center"><img src="./docs/logo.svg" alt="PHP Monitor Logo" width="500px" /></p>
|
||||||
|
|
||||||
**PHP Monitor** (or *phpmon*) is a lightweight macOS utility app that runs on your Mac and displays the active PHP version in your status bar. It's tightly integrated with [Laravel Valet](https://github.com/laravel/valet), so <u>you need to have it set up before you can use this app</u> (consult the FAQ below with info about how to set up your environment).
|
**PHP Monitor** (or *phpmon*) is a lightweight macOS utility app that runs on your Mac and displays the active PHP version in your status bar. It's tightly integrated with [Laravel Valet](https://github.com/laravel/valet), so <u>you need to have it set up if you want to use all of the functionality of the app</u> (consult the FAQ below with info about how to set up your environment).
|
||||||
|
|
||||||
<img src="./docs/screenshot.jpg#gh-light-mode-only" width="1280px" alt="phpmon screenshot (menu bar app)"/>
|
<img src="./docs/screenshot.jpg" width="1280px" alt="phpmon screenshot (menu bar app)"/>
|
||||||
<img src="./docs/screenshot-dark.jpg#gh-dark-mode-only" width="1280px" alt="phpmon screenshot (menu bar app)"/>
|
|
||||||
|
|
||||||
<small><i>Screenshot: Showing the key functionality of PHP Monitor.</i></small>
|
<small><i>Screenshot: Showing the key functionality of PHP Monitor.</i></small>
|
||||||
|
|
||||||
It's super convenient to switch between different versions of PHP. You'll even get notifications (only if you choose to opt-in, of course)!
|
It's super convenient to switch between different versions of PHP. You'll even get notifications (only if you choose to opt-in, of course)!
|
||||||
|
|
||||||
<img src="./docs/notification.png#gh-light-mode-only" width="370px" alt="phpmon screenshot (notification)"/>
|
<img src="./docs/notification.png" width="370px" alt="phpmon screenshot (notification)"/>
|
||||||
<img src="./docs/notification-dark.png#gh-dark-mode-only" width="370px" alt="phpmon screenshot (notification)"/>
|
|
||||||
|
|
||||||
PHP Monitor also gives you quick access to various useful functionality (like accessing configuration files, restarting services, and more).
|
PHP Monitor also gives you quick access to various useful functionality (like accessing configuration files, restarting services, and more).
|
||||||
|
|
||||||
@ -24,18 +22,18 @@ You can also add new domains as links, isolate sites, manage various services, a
|
|||||||
PHP Monitor is a universal application that runs natively on Apple Silicon **and** Intel-based Macs.
|
PHP Monitor is a universal application that runs natively on Apple Silicon **and** Intel-based Macs.
|
||||||
|
|
||||||
* Your user account can administer your computer (required for some functionality, e.g. certificate generation)
|
* Your user account can administer your computer (required for some functionality, e.g. certificate generation)
|
||||||
* macOS 12.4 or later (Monterey and Ventura are supported)
|
* macOS 13.5 or later
|
||||||
* Homebrew is installed in `/usr/local/homebrew` or `/opt/homebrew`
|
* Homebrew is installed in the default location (`/usr/local/homebrew` or `/opt/homebrew`)
|
||||||
* Homebrew `php` formula is installed
|
* Homebrew `php` formula is installed
|
||||||
* Laravel Valet (works with Valet v2, v3 and v4)
|
* Optional but recommended: Laravel Valet
|
||||||
|
|
||||||
_You may need to update your Valet installation to keep everything working if a major version update of PHP has been released. You can do this by running `composer global update && valet install`. Some features are not supported when running Valet 2._
|
_Starting with PHP Monitor 6.0, you do not need to have Laravel Valet installed for PHP Monitor to work. To get access to all features of PHP Monitor however, installing Valet is **recommended**._
|
||||||
|
|
||||||
For more information, please see [SECURITY.md](./SECURITY.md) to find out which version of the app is currently supported.
|
For more information, please see [SECURITY.md](./SECURITY.md) to find out which version of the app is currently supported.
|
||||||
|
|
||||||
## 🚀 How to install
|
## 🚀 How to install
|
||||||
|
|
||||||
Again, make sure you have **[Laravel Valet](https://laravel.com/docs/master/valet)** installed first:
|
Again, if you want to have access to *all features* of PHP Monitor, I recommend installing **[Laravel Valet](https://laravel.com/docs/master/valet)** first:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
composer global require laravel/valet
|
composer global require laravel/valet
|
||||||
@ -43,13 +41,17 @@ valet install
|
|||||||
valet trust
|
valet trust
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Manual installation (first time only)
|
Currently, PHP Monitor is compatible with Laravel Valet v2, v3 and v4. Each of these versions of Valet support slightly different PHP versions, which is why legacy versions remain supported. Please note that some features are not available in older versions of Valet, like site isolation.
|
||||||
|
|
||||||
|
#### Manual installation (recommended, first time only)
|
||||||
|
|
||||||
Once that's done, you can [download the latest release](https://github.com/nicoverbruggen/phpmon/releases/latest), unzip it and place it in `/Applications`.
|
Once that's done, you can [download the latest release](https://github.com/nicoverbruggen/phpmon/releases/latest), unzip it and place it in `/Applications`.
|
||||||
|
|
||||||
#### Installation via Homebrew
|
#### Installation via Homebrew
|
||||||
|
|
||||||
If you prefer to install the app via Homebrew, you can also do this:
|
*Prior to version 5.8, this was the recommended way of installing PHP Monitor.*
|
||||||
|
|
||||||
|
If you prefer to install the app via Homebrew, you can also run the following:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
brew tap nicoverbruggen/homebrew-cask
|
brew tap nicoverbruggen/homebrew-cask
|
||||||
@ -58,9 +60,11 @@ brew install --cask phpmon
|
|||||||
|
|
||||||
## ⬆️ How to update
|
## ⬆️ How to update
|
||||||
|
|
||||||
The recommended method of updating your app to the latest version is to use **the built-in updater**.
|
The recommended method of updating the app to the latest version is to use **the built-in updater**.
|
||||||
|
|
||||||
If that doesn't work or you prefer Homebrew, you can also upgrade via those methods.
|
If you have a very slow internet connection, the updater may report that the download has timed out. In that case, you may wish to manually update by [downloading the latest release](https://github.com/nicoverbruggen/phpmon/releases/latest) and placing the app in `/Applications`.
|
||||||
|
|
||||||
|
(You may also use Homebrew to update PHP Monitor, but this will require you to approve the app every time an update is installed. If you use the built-in updater, this won't be necessary.)
|
||||||
|
|
||||||
## ⚡️ Launchers (Alfred, Raycast)
|
## ⚡️ Launchers (Alfred, Raycast)
|
||||||
|
|
||||||
@ -78,6 +82,16 @@ I wanted to be able to **see at a glance** which version of PHP was linked, and
|
|||||||
|
|
||||||
Initially, I had an Alfred workflow for this — but it has now been replaced with this utility, which also does a good job at displaying additional information at a glance, like the current PHP version, memory limits, and more.
|
Initially, I had an Alfred workflow for this — but it has now been replaced with this utility, which also does a good job at displaying additional information at a glance, like the current PHP version, memory limits, and more.
|
||||||
|
|
||||||
|
## 🐘 Why not use Laravel Herd?
|
||||||
|
|
||||||
|
_**Disclaimer**: The author is not affiliated with Laravel or the Laravel team, nor Beyond Code, who maintain Laravel Herd. PHP Monitor is an independent project._
|
||||||
|
|
||||||
|
If you don't need to customize your local PHP setup and just want an easy and ready-to-go environment to start coding, [Laravel Herd](https://herd.laravel.com) is probably more than sufficient for many use cases. They also offer paid features that may be useful to you or your team.
|
||||||
|
|
||||||
|
At this point, many people enjoy using Herd. However, Herd may not be for everyone, which is why other solutions to run PHP locally exist. If you need more customization and flexibility I encourage you to consider PHP Monitor in combination with Laravel Valet.
|
||||||
|
|
||||||
|
If you want to get as close as you can to a real server environment your best bet is probably to use a Docker container. I _highly_ recommend that you try different setups, and use what you like best.
|
||||||
|
|
||||||
## 🤬 The app won't start?!
|
## 🤬 The app won't start?!
|
||||||
|
|
||||||
PHP Monitor performs some integrity checks to ensure a good experience when using the app. You'll get a message telling you that PHP Monitor won't work correctly in a variety of scenarios.
|
PHP Monitor performs some integrity checks to ensure a good experience when using the app. You'll get a message telling you that PHP Monitor won't work correctly in a variety of scenarios.
|
||||||
@ -100,48 +114,47 @@ All stable and supported PHP versions are also supported by PHP Monitor. However
|
|||||||
> **Note**
|
> **Note**
|
||||||
> If you have versions of PHP installed that can be detected by PHP Monitor but is *not* supported by the currently active version of Valet, you will be alerted by an item in the menu with an exclamation mark emoji. (⚠️)
|
> If you have versions of PHP installed that can be detected by PHP Monitor but is *not* supported by the currently active version of Valet, you will be alerted by an item in the menu with an exclamation mark emoji. (⚠️)
|
||||||
|
|
||||||
Backports are available via [this tap](https://github.com/shivammathur/homebrew-php). For more information about those backports, please see the next FAQ entry.
|
Backports that are installable via PHP Monitor's **PHP Version Manager** functionality are subject to availability via [this tap](https://github.com/shivammathur/homebrew-php).
|
||||||
|
|
||||||
|
PHP extensions that are installable via PHP Monitor's **PHP Extension Manager** functionality are subject to availability via [this tap](https://github.com/shivammathur/homebrew-extensions).
|
||||||
|
|
||||||
For maximum compatibility with older PHP versions, you may wish to keep using Valet 2 or 3. For more information, please see [SECURITY.md](./SECURITY.md) to find out which versions of PHP are supported with different versions of Valet.
|
For maximum compatibility with older PHP versions, you may wish to keep using Valet 2 or 3. For more information, please see [SECURITY.md](./SECURITY.md) to find out which versions of PHP are supported with different versions of Valet.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><strong>How do I install additional versions of PHP, including legacy versions?</strong></summary>
|
<summary><strong>How do I install additional versions of PHP, including legacy versions?</strong></summary>
|
||||||
|
|
||||||
Assuming you have installed the `php` formula, the latest stable version of PHP is installed. At the time of writing, this is PHP 8.2.
|
Assuming you have installed the `php` formula, the latest stable version of PHP is installed. At the time of writing, this is PHP 8.3.
|
||||||
|
|
||||||
You can install other supported versions of PHP out of the box, so `php@8.0` and `php@8.1` at the time of writing.
|
You can install other supported versions of PHP via PHP Monitor's **PHP Version Manager**. (You can manually install or upgrade PHP versions too, but this is not recommended.)
|
||||||
|
|
||||||
If you wish to install older (officially unsupported) versions of PHP for local use, you can do so by using [Shivam Mathur's tap](https://github.com/shivammathur/homebrew-php):
|
Please keep in mind that installing or updating PHP versions, even when done via PHP Monitor's **PHP Version Manager**, may cause other required formula dependencies (required software needed to keep those PHP versions functional) to be upgraded. It might not be very transparent when this happens, but this is likely the cause if installing a PHP version takes longer than expected: usually other dependencies are also being installed.
|
||||||
|
|
||||||
```sh
|
Additionally, upgrading one specific version of PHP may also cause other installed versions of PHP to *also* be updated in one go, if the dependencies for that one version also apply to the other (newer) version(s) of PHP. It's a bit tricky to manage PHP versions via Homebrew, and even PHP Monitor may encounter some difficulties.
|
||||||
brew tap shivammathur/php
|
|
||||||
```
|
|
||||||
|
|
||||||
You may find that this tap is already in use: if you've used Valet before, it automatically uses this tap for legacy versions of PHP.
|
If you encounter a strange scenario or a malfunction, please open an issue on the issue tracker and get in touch. I'd like to keep enhancing this process to make it as foolproof as possible.
|
||||||
|
|
||||||
```sh
|
> *Note*: Using PHP Monitor when managing PHP versions may cause [temporary alias conflicts](https://github.com/nicoverbruggen/phpmon/issues/54#issuecomment-979789724) while the core tap alias and the tap's alias refer to a different version of PHP, but this is generally speaking a minor inconvenience, since this normally only applies when a new PHP version releases.
|
||||||
brew install shivammathur/php/php@7.4
|
|
||||||
brew install shivammathur/php/php@7.3
|
|
||||||
brew install shivammathur/php/php@7.2
|
|
||||||
brew install shivammathur/php/php@7.1
|
|
||||||
brew install shivammathur/php/php@7.0
|
|
||||||
```
|
|
||||||
|
|
||||||
**Always make sure to restart PHP Monitor after installing or upgrading PHP versions!**
|
|
||||||
|
|
||||||
> *Note*: Using this tap may cause [temporary alias conflicts](https://github.com/nicoverbruggen/phpmon/issues/54#issuecomment-979789724) while the core tap alias and the tap's alias refer to a different version of PHP, but this is generally speaking a minor inconvenience, since this normally only applies when a new PHP version releases.
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><strong>I want PHP Monitor to start up when I boot my Mac!</strong></summary>
|
<summary><strong>I want PHP Monitor to start up when I boot my Mac!</strong></summary>
|
||||||
|
|
||||||
You can do this by dragging *PHP Monitor.app* into the **Login Items** section in **System Preferences > Users & Groups** for your account.
|
If you are running macOS Ventura or newer, there's an option in the Settings menu that you can select: "Start PHP Monitor at login".
|
||||||
|
|
||||||
|
If you are on an older version of macOS, you can do this by dragging *PHP Monitor.app* into the **Login Items** section in **System Preferences > Users & Groups** for your account.
|
||||||
|
|
||||||
Super convenient!
|
Super convenient!
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><strong>What features are unavailable in Standalone Mode?</strong></summary>
|
||||||
|
|
||||||
|
The services manager is disabled, and all other obvious Laravel Valet integrations (configuration finder, domains list, Fix My Valet) are also disabled.
|
||||||
|
|
||||||
|
(Most other features remain available.)
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><strong>I want to set up PHP Monitor from scratch! I don't have Homebrew installed either, where do I begin?</strong></summary>
|
<summary><strong>I want to set up PHP Monitor from scratch! I don't have Homebrew installed either, where do I begin?</strong></summary>
|
||||||
|
|
||||||
@ -187,6 +200,10 @@ Make sure PHP is linked correctly:
|
|||||||
|
|
||||||
should return: `/usr/local/bin/php` (or `/opt/homebrew/bin/php` if you are on Apple Silicon)
|
should return: `/usr/local/bin/php` (or `/opt/homebrew/bin/php` if you are on Apple Silicon)
|
||||||
|
|
||||||
|
**If you don't need Laravel Valet, you can stop here. PHP Monitor will work like this in Standalone Mode.**
|
||||||
|
|
||||||
|
If you'd like to have Valet as well, continue and install Valet with Composer, like this.
|
||||||
|
|
||||||
composer global require laravel/valet
|
composer global require laravel/valet
|
||||||
|
|
||||||
For optimal results, you should lock your PHP platform for global dependencies to the oldest version of PHP you intend to run. If that version is PHP 7.0, your `~/.composer/composer.json` file could look like this (please adjust the version accordingly!):
|
For optimal results, you should lock your PHP platform for global dependencies to the oldest version of PHP you intend to run. If that version is PHP 7.0, your `~/.composer/composer.json` file could look like this (please adjust the version accordingly!):
|
||||||
@ -214,11 +231,6 @@ This should install `dnsmasq` and set up Valet. Great, almost there!
|
|||||||
|
|
||||||
valet trust
|
valet trust
|
||||||
|
|
||||||
You can now install PHP Monitor, if you haven't already:
|
|
||||||
|
|
||||||
brew tap nicoverbruggen/homebrew-cask
|
|
||||||
brew install --cask phpmon
|
|
||||||
|
|
||||||
Finally, run PHP Monitor. Since the app is notarized and signed with a developer ID, it should work. You will need to approve the initial launch of the app, but you should be ready to go now.
|
Finally, run PHP Monitor. Since the app is notarized and signed with a developer ID, it should work. You will need to approve the initial launch of the app, but you should be ready to go now.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@ -227,13 +239,17 @@ Finally, run PHP Monitor. Since the app is notarized and signed with a developer
|
|||||||
|
|
||||||
PHP Monitor will check if an update is available every time you start the app.
|
PHP Monitor will check if an update is available every time you start the app.
|
||||||
|
|
||||||
You can disable this behaviour by going to Preferences (via the PHP Monitor icon in the menu bar) and unchecking "Automatically check for updates". You can always check for updates manually.
|
You can disable this behaviour by going to Preferences (via the PHP Monitor icon in the menu bar) and unchecking "Automatically check for updates". (You can always check for updates manually.)
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><strong>I have PHP Monitor installed, and it works. I want to upgrade my PHP installations to the latest version, what's the best way to do this?</strong></summary>
|
<summary><strong>I have PHP Monitor installed, and it works. I want to upgrade my PHP installations to the latest version, what's the best way to do this?</strong></summary>
|
||||||
|
|
||||||
|
The easiest way is to simply use the built-in **PHP Version Manager**, which will allow you to upgrade your PHP versions with one click.
|
||||||
|
|
||||||
|
If you want to do this manually, you can follow the instructions below.
|
||||||
|
|
||||||
It's easy to make a mistake here, and end up with an unlinked version of PHP or have versions missing from PHP Monitor.
|
It's easy to make a mistake here, and end up with an unlinked version of PHP or have versions missing from PHP Monitor.
|
||||||
|
|
||||||
Here's what I usually do:
|
Here's what I usually do:
|
||||||
@ -276,6 +292,8 @@ This problem is usually resolved by upgrading Valet and running `valet install`
|
|||||||
composer global update
|
composer global update
|
||||||
valet install
|
valet install
|
||||||
|
|
||||||
|
If you are seeing a 502 (Bad Gateway) error after about 30 seconds or so, your request is likely timing out. You may need to solve a performance issue with your own code.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -316,12 +334,14 @@ Make sure you have at least **Valet 3.0** installed, since support for isolation
|
|||||||
<details>
|
<details>
|
||||||
<summary><strong>One of the limits (memory limit, max POST size, max upload size) shows an exclamation mark!</strong></summary>
|
<summary><strong>One of the limits (memory limit, max POST size, max upload size) shows an exclamation mark!</strong></summary>
|
||||||
|
|
||||||
The value you provided in your INI file is invalid. If that is the case, PHP will attempt to parse your value as bytes, which is usually unintended. (`1GB` will resolve to merely a few bytes, and all of your applications will run out of memory!)
|
The value you provided in your `.ini` file is invalid. If that is the case, PHP will attempt to parse your value as bytes, which is usually unintended. (`1GB` will resolve to merely a few bytes, and all of your applications will run out of memory!)
|
||||||
|
|
||||||
You must a provide a value like so: `1024K`, `256M`, `1G`. Alternatively, `-1` is also allowed, or just an integer (which will result in N amount of bytes being the limit).
|
You must a provide a value like so: `1024K`, `256M`, `1G`. Alternatively, `-1` is also allowed, or just an integer (which will result in N amount of bytes being the limit).
|
||||||
|
|
||||||
**Example**: Trying to use `1GB` as the memory limit, for example, will result in this exclamation mark. The correct way to set a 1GB limit is by using `1G` as the value. (Note: The displayed value will append `B` for clarity, so if you set `1G`, the value reported by PHP Monitor will be 1 GB.)
|
**Example**: Trying to use `1GB` as the memory limit, for example, will result in this exclamation mark. The correct way to set a 1GB limit is by using `1G` as the value. (Note: The displayed value will append `B` for clarity, so if you set `1G`, the value reported by PHP Monitor will be 1 GB.)
|
||||||
|
|
||||||
|
(If you are using Valet, you can adjust these limits in the `.conf.d/php-memory-limits.ini` file. Otherwise, you may need to adjust `php.ini`.)
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -410,6 +430,9 @@ You can omit the `php` key in the preset if you do not wish for the preset to sw
|
|||||||
<details>
|
<details>
|
||||||
<summary><strong>How do I ensure additional Homebrew services are shown in the app?</strong></summary>
|
<summary><strong>How do I ensure additional Homebrew services are shown in the app?</strong></summary>
|
||||||
|
|
||||||
|
> **Info**
|
||||||
|
> Homebrew services aren't displayed if you are using Valet in Standalone Mode.
|
||||||
|
|
||||||
You must set these services up in a JSON file, located in `~/.config/phpmon/config.json`.
|
You must set these services up in a JSON file, located in `~/.config/phpmon/config.json`.
|
||||||
|
|
||||||
You can specify custom services in the configuration file for Homebrew services that run as your own user (not root).
|
You can specify custom services in the configuration file for Homebrew services that run as your own user (not root).
|
||||||
@ -590,9 +613,9 @@ Thank you very much for your contributions, kind words and support.
|
|||||||
|
|
||||||
### Loading info about PHP in the background
|
### Loading info about PHP in the background
|
||||||
|
|
||||||
This utility runs `php-config --version` in the background periodically. It also checks your `.ini` files for extensions and loads more information about your limits (memory limit, POST limit, upload limit).
|
This app runs `php-config --version` in the background periodically, usually whenever your Homebrew configuration is modified. A filesystem watcher is used to determine if anything changes in your Homebrew's `bin` directory.
|
||||||
|
|
||||||
In order to save power, this only happens once every 60 seconds.
|
PHP Monitor also checks your `.ini` files for extensions and loads more information about your limits (memory limit, POST limit, upload limit). See also the section on *Config change detection* below.
|
||||||
|
|
||||||
### Switching PHP versions
|
### Switching PHP versions
|
||||||
|
|
||||||
@ -600,7 +623,7 @@ This utility will detect which PHP versions you have installed via Homebrew, and
|
|||||||
|
|
||||||
The switcher will disable all PHP-FPM services not belonging to the version you wish to use, and link the desired version of PHP. Then, it'll restart your desired PHP version's FPM process. This all happens in parallel, so this should be a bit faster than Valet’s switcher.
|
The switcher will disable all PHP-FPM services not belonging to the version you wish to use, and link the desired version of PHP. Then, it'll restart your desired PHP version's FPM process. This all happens in parallel, so this should be a bit faster than Valet’s switcher.
|
||||||
|
|
||||||
If you're using Valet 3, versions of PHP-FPM required to keep isolated sites up and running will also be started or stopped as needed.
|
If you're using Valet 3 or newer, versions of PHP-FPM required to keep isolated sites up and running will also be started or stopped as needed.
|
||||||
|
|
||||||
### Config change detection
|
### Config change detection
|
||||||
|
|
||||||
|
20
SECURITY.md
@ -2,22 +2,28 @@
|
|||||||
|
|
||||||
## Supported versions
|
## Supported versions
|
||||||
|
|
||||||
Generally speaking, only the latest version of **PHP Monitor** is supported, except during transition periods (for example, when particular system requirements go up):
|
Generally speaking, only the latest version of **PHP Monitor** is supported, except during transition periods (for example, when particular system requirements go up).
|
||||||
|
|
||||||
| Version | Apple Silicon | Supported | Supported macOS | Deployment Target | Detected PHP Versions | Recommended Valet Version |
|
| Version | Apple Silicon | Supported | Supported macOS | Minimum Deployment | Detected PHP Versions | Recommended Valet Version |
|
||||||
| ------- | ------------- | ------------------ | ----- | ----- | ----- | ----
|
| ------- | ------------- | ------------------ | ----- | ----- | ----- | ----
|
||||||
| 5.8 | ✅ Universal binary | ✅ Yes | Monterey (12.4+)<br/>Ventura (13.0+) | macOS 12.4 | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.2 (w/ Valet 4.x*) | 3.0 or higher recommended<br/> 2.16.2 minimum |
|
| 25 | ✅ Universal binary | ✅ Yes | Ventura (13.5+)<br/>Sonoma (14.0+)<br/>Sequoia (15.0+)<br/>Tahoe (26.0+)* | macOS 13.5+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.4 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.5 (w/ Valet 4.x)| 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
|
||||||
(*) Preliminary listing. Valet 4 hasn't been released yet and the versions of PHP Valet can work with might still change.
|
(*) Denotes preliminary supported based on the app being built with the latest version of the SDK prior to the release of the latest release of macOS. Please check out the pinned issue for more information.
|
||||||
|
|
||||||
## Legacy versions
|
## Legacy versions
|
||||||
|
|
||||||
These versions of PHP Monitor are no longer supported, but if you’re using an older computer with an older version of Homebrew, Valet or macOS, you might want to use one of these versions.
|
These versions of PHP Monitor are no longer supported, but if you’re using an older computer with an older version of Homebrew, Valet or macOS, you might want to use one of these versions.
|
||||||
|
|
||||||
| Version | Apple Silicon | Supported | Supported macOS | Deployment Target | Detected PHP Versions | Minimum Required Valet Version |
|
| Version | Apple Silicon | Supported | Supported macOS | Minimum Deployment | Detected PHP Versions | Minimum Required Valet Version |
|
||||||
| ------- | ------------- | ------------------ | ----- | ----- | ----- | ----
|
| ------- | ------------- | ------------------ | ----- | ----- | ----- | ----
|
||||||
| 5.7 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0)<br/>Ventura (13.0)* | macOS 11+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x) | 3.0 recommended<br/> 2.16.2 minimum |
|
| 7.1 | ✅ Universal binary | ❌ | Monterey (12.4+)<br/>Ventura (13.0+)<br/>Sonoma (14.0+)<br/>Sequoia (15.0+) | macOS 12.4+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.4 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.5 (w/ Valet 4.x)| 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
| 5.6 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0)<br/>Ventura (13.0)* | macOS 11+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x) | 3.0 recommended<br/> 2.16.2 minimum |
|
| 7.0 | ✅ Universal binary | ❌ | Monterey (12.4+)<br/>Ventura (13.0+)<br/>Sonoma (14.0) | macOS 12.4+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.4 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.4 (w/ Valet 4.x)| 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
| 6.2 | ✅ Universal binary | ❌ | Monterey (12.4+)<br/>Ventura (13.0+)<br/>Sonoma (14.0) | macOS 12.4+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.4 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.4 (w/ Valet 4.x)| 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
| 6.1 | ✅ Universal binary | ❌ | Monterey (12.4+)<br/>Ventura (13.0+)<br/>Sonoma (14.0) | macOS 12.4+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.4 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.4 (w/ Valet 4.x)| 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
| 6.0 | ✅ Universal binary | ❌ | Monterey (12.4+)<br/>Ventura (13.0+) | macOS 12.4+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.2 (w/ Valet 4.x) | 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
| 5.8 | ✅ Universal binary | ❌ | Monterey (12.4+)<br/>Ventura (13.0+) | macOS 12.4+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.2 (w/ Valet 4.x) | 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
| 5.7 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0)<br/>Ventura (13.0) | macOS 11+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x)<br/>PHP 7.1-PHP 8.2 (w/ Valet 4.x) | 3.0 or higher recommended<br/> 2.16.2 minimum |
|
||||||
|
| 5.6 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0)<br/>Ventura (13.0) | macOS 11+ | PHP 5.6—PHP 8.2 (w/ Valet 2.x)<br/>PHP 7.0—PHP 8.2 (w/ Valet 3.x) | 3.0 recommended<br/> 2.16.2 minimum |
|
||||||
| 4.1 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0) | macOS 11+ | PHP 5.6—PHP 8.2 | 2.16.2 |
|
| 4.1 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0) | macOS 11+ | PHP 5.6—PHP 8.2 | 2.16.2 |
|
||||||
| 4.0 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0) | macOS 10.14+ | PHP 5.6—PHP 8.2 | 2.13 |
|
| 4.0 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0) | macOS 10.14+ | PHP 5.6—PHP 8.2 | 2.13 |
|
||||||
| 3.5 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0) | macOS 10.14+ | PHP 5.6—PHP 8.2 | 2.13 |
|
| 3.5 | ✅ Universal binary | ❌ | Big Sur (11.0)<br/>Monterey (12.0) | macOS 10.14+ | PHP 5.6—PHP 8.2 | 2.13 |
|
||||||
|
BIN
assets/affinity/icon-legacy.afdesign
Normal file
BIN
assets/affinity/icon-unified.afdesign
Normal file
BIN
assets/affinity/logo.afdesign
Normal file
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
1
assets/icon-2025.svg
Normal file
After Width: | Height: | Size: 24 KiB |
10
assets/xcode-icon-composer/icon.icon/Assets/phpmon.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 500 500" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||||
|
<g transform="matrix(1.25033,-0.175723,0.175723,1.25033,14.4412,107.226)">
|
||||||
|
<path d="M133.3,83.75L120.4,83.75L120.4,54.437C120.4,52.134 118.465,50.25 116.1,50.25L107.5,50.25C105.135,50.25 103.2,52.134 103.2,54.438L103.2,96.312C103.2,98.616 105.135,100.5 107.5,100.5L133.3,100.5C135.665,100.5 137.6,98.616 137.6,96.312L137.6,87.938C137.6,85.634 135.665,83.75 133.3,83.75ZM335.4,184.25L326.8,184.25L326.8,127.666C326.8,121.019 324.059,114.633 319.221,109.922L265.525,57.63C260.688,52.92 254.13,50.25 247.304,50.25L223.6,50.25L223.6,25.125C223.6,11.254 212.044,0 197.8,0L25.8,0C11.556,0 0,11.254 0,25.125L0,192.625C0,206.496 11.556,217.75 25.8,217.75L34.4,217.75C34.4,245.492 57.513,268 86,268C114.487,268 137.6,245.492 137.6,217.75L206.4,217.75C206.4,245.492 229.512,268 258,268C286.488,268 309.6,245.492 309.6,217.75L335.4,217.75C340.13,217.75 344,213.981 344,209.375L344,192.625C344,188.019 340.13,184.25 335.4,184.25ZM86,242.875C71.756,242.875 60.2,231.621 60.2,217.75C60.2,203.879 71.756,192.625 86,192.625C100.244,192.625 111.8,203.879 111.8,217.75C111.8,231.621 100.244,242.875 86,242.875ZM111.8,150.75C78.529,150.75 51.6,124.526 51.6,92.125C51.6,59.725 78.529,33.5 111.8,33.5C145.071,33.5 172,59.724 172,92.125C172,124.525 145.071,150.75 111.8,150.75ZM258,242.875C243.756,242.875 232.2,231.621 232.2,217.75C232.2,203.879 243.756,192.625 258,192.625C272.244,192.625 283.8,203.879 283.8,217.75C283.8,231.621 272.244,242.875 258,242.875ZM301,134L223.6,134L223.6,75.375L247.304,75.375L301,127.666L301,134Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.96882e-14,321.533,-321.533,1.96882e-14,172.079,-41.4918)"><stop offset="0" style="stop-color:rgb(81,194,251);stop-opacity:1"/><stop offset="0" style="stop-color:rgb(81,194,251);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(28,145,254);stop-opacity:1"/></linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
48
assets/xcode-icon-composer/icon.icon/icon.json
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"fill" : {
|
||||||
|
"linear-gradient" : [
|
||||||
|
"srgb:0.27800,0.58000,0.98800,1.00000",
|
||||||
|
"srgb:0.27800,0.58000,0.98800,1.00000"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"groups" : [
|
||||||
|
{
|
||||||
|
"blend-mode" : "screen",
|
||||||
|
"blur-material" : null,
|
||||||
|
"layers" : [
|
||||||
|
{
|
||||||
|
"blend-mode" : "normal",
|
||||||
|
"fill" : {
|
||||||
|
"solid" : "srgb:1.00000,0.99038,0.96423,1.00000"
|
||||||
|
},
|
||||||
|
"glass" : true,
|
||||||
|
"image-name" : "phpmon.svg",
|
||||||
|
"name" : "phpmon",
|
||||||
|
"position" : {
|
||||||
|
"scale" : 1.85,
|
||||||
|
"translation-in-points" : [
|
||||||
|
10.0234375,
|
||||||
|
8.21875
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lighting" : "individual",
|
||||||
|
"shadow" : {
|
||||||
|
"kind" : "neutral",
|
||||||
|
"opacity" : 0.5
|
||||||
|
},
|
||||||
|
"specular" : true,
|
||||||
|
"translucency" : {
|
||||||
|
"enabled" : true,
|
||||||
|
"value" : 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported-platforms" : {
|
||||||
|
"circles" : [
|
||||||
|
"watchOS"
|
||||||
|
],
|
||||||
|
"squares" : "shared"
|
||||||
|
}
|
||||||
|
}
|
BIN
docs/logo.png
Before Width: | Height: | Size: 51 KiB |
57
docs/logo.svg
Normal file
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 524 KiB |
Before Width: | Height: | Size: 519 KiB After Width: | Height: | Size: 723 KiB |
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 41 KiB |
BIN
phpmon-updater/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
Normal file
After Width: | Height: | Size: 811 B |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 131 KiB |
BIN
phpmon-updater/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 450 KiB |
6
phpmon-updater/Assets.xcassets/Contents.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
23
phpmon-updater/main.swift
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
//
|
||||||
|
// AppDelegate.swift
|
||||||
|
// PHP Monitor Self-Updater
|
||||||
|
//
|
||||||
|
// Created by Nico Verbruggen on 01/02/2023.
|
||||||
|
// Copyright © 2023 Nico Verbruggen. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Cocoa
|
||||||
|
import NVAppUpdater
|
||||||
|
|
||||||
|
let delegate = SelfUpdater(
|
||||||
|
appName: "PHP Monitor",
|
||||||
|
bundleIdentifiers: [
|
||||||
|
"com.nicoverbruggen.phpmon.eap",
|
||||||
|
"com.nicoverbruggen.phpmon.dev",
|
||||||
|
"com.nicoverbruggen.phpmon"
|
||||||
|
],
|
||||||
|
selfUpdaterPath: "~/.config/phpmon/updater"
|
||||||
|
)
|
||||||
|
|
||||||
|
NSApplication.shared.delegate = delegate
|
||||||
|
_ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
|
5
phpmon-updater/phpmon-updater.entitlements
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict/>
|
||||||
|
</plist>
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 558 B After Width: | Height: | Size: 783 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 457 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 632 B After Width: | Height: | Size: 790 B |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 648 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 575 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 41 KiB |
68
phpmon/Assets.xcassets/AppIconEAP.appiconset/Contents.json
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "icon_16x16.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "16x16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_16x16@2x.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "16x16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_32x32.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "32x32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_32x32@2x.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "32x32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_128x128.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "128x128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_128x128@2x.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "128x128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_256x256.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "256x256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_256x256@2x.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "256x256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_512x512.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "512x512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "icon_512x512@2x.png",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "512x512"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_128x128.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_128x128@2x.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_16x16.png
Normal file
After Width: | Height: | Size: 819 B |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_16x16@2x.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_256x256.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_256x256@2x.png
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_32x32.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_32x32@2x.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_512x512.png
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
phpmon/Assets.xcassets/AppIconEAP.appiconset/icon_512x512@2x.png
Normal file
After Width: | Height: | Size: 499 KiB |
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "1.000",
|
||||||
|
"green" : "1.000",
|
||||||
|
"red" : "1.000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0.172",
|
||||||
|
"green" : "0.182",
|
||||||
|
"red" : "0.182"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0.988",
|
||||||
|
"green" : "0.580",
|
||||||
|
"red" : "0.278"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0.988",
|
||||||
|
"green" : "0.444",
|
||||||
|
"red" : "0.277"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "0.300",
|
||||||
|
"blue" : "0.180",
|
||||||
|
"green" : "0.841",
|
||||||
|
"red" : "1.000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "0.300",
|
||||||
|
"blue" : "0.426",
|
||||||
|
"green" : "0.809",
|
||||||
|
"red" : "1.000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
24
phpmon/Assets.xcassets/ValetDriverIcon.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "ValetDriverIcon@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
BIN
phpmon/Assets.xcassets/ValetDriverIcon.imageset/ValetDriverIcon@2x.png
vendored
Normal file
After Width: | Height: | Size: 831 B |
25
phpmon/Assets.xcassets/php.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "php.svg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"preserves-vector-representation" : true,
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
1
phpmon/Assets.xcassets/php.imageset/php.svg
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="800" viewBox="0 0 24 24"><path d="M7.01 10.207h-.944l-.515 2.648h.838c.556 0 .97-.105 1.242-.314.272-.21.455-.559.55-1.049.092-.47.05-.802-.124-.995-.175-.193-.523-.29-1.047-.29zM12 5.688C5.373 5.688 0 8.514 0 12s5.373 6.313 12 6.313S24 15.486 24 12c0-3.486-5.373-6.312-12-6.312zm-3.26 7.451c-.261.25-.575.438-.917.551-.336.108-.765.164-1.285.164H5.357l-.327 1.681H3.652l1.23-6.326h2.65c.797 0 1.378.209 1.744.628.366.418.476 1.002.33 1.752a2.836 2.836 0 0 1-.305.847c-.143.255-.33.49-.561.703zm4.024.715.543-2.799c.063-.318.039-.536-.068-.651-.107-.116-.336-.174-.687-.174H11.46l-.704 3.625H9.388l1.23-6.327h1.367l-.327 1.682h1.218c.767 0 1.295.134 1.586.401s.378.7.263 1.299l-.572 2.944h-1.389zm7.597-2.265a2.782 2.782 0 0 1-.305.847c-.143.255-.33.49-.561.703a2.44 2.44 0 0 1-.917.551c-.336.108-.765.164-1.286.164h-1.18l-.327 1.682h-1.378l1.23-6.326h2.649c.797 0 1.378.209 1.744.628.366.417.477 1.001.331 1.751zm-2.595-1.382h-.943l-.516 2.648h.838c.557 0 .971-.105 1.242-.314.272-.21.455-.559.551-1.049.092-.47.049-.802-.125-.995s-.524-.29-1.047-.29z"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
@ -16,7 +16,26 @@ protocol CommandProtocol {
|
|||||||
- Parameter path: The path of the command or program to invoke.
|
- Parameter path: The path of the command or program to invoke.
|
||||||
- Parameter arguments: A list of arguments that are passed on.
|
- Parameter arguments: A list of arguments that are passed on.
|
||||||
- Parameter trimNewlines: Removes empty new line output.
|
- Parameter trimNewlines: Removes empty new line output.
|
||||||
|
- Parameter withStandardError: Outputs standard error output to the same string output as well.
|
||||||
*/
|
*/
|
||||||
func execute(path: String, arguments: [String], trimNewlines: Bool) -> String
|
func execute(
|
||||||
|
path: String,
|
||||||
|
arguments: [String],
|
||||||
|
trimNewlines: Bool,
|
||||||
|
withStandardError: Bool
|
||||||
|
) -> String
|
||||||
|
|
||||||
|
/**
|
||||||
|
Immediately executes a command.
|
||||||
|
|
||||||
|
- Parameter path: The path of the command or program to invoke.
|
||||||
|
- Parameter arguments: A list of arguments that are passed on.
|
||||||
|
- Parameter trimNewlines: Removes empty new line output.
|
||||||
|
*/
|
||||||
|
func execute(
|
||||||
|
path: String,
|
||||||
|
arguments: [String],
|
||||||
|
trimNewlines: Bool
|
||||||
|
) -> String
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,13 +9,23 @@ import Cocoa
|
|||||||
|
|
||||||
public class RealCommand: CommandProtocol {
|
public class RealCommand: CommandProtocol {
|
||||||
|
|
||||||
public func execute(path: String, arguments: [String], trimNewlines: Bool = false) -> String {
|
public func execute(
|
||||||
|
path: String,
|
||||||
|
arguments: [String],
|
||||||
|
trimNewlines: Bool,
|
||||||
|
withStandardError: Bool
|
||||||
|
) -> String {
|
||||||
let task = Process()
|
let task = Process()
|
||||||
task.launchPath = path
|
task.launchPath = path
|
||||||
task.arguments = arguments
|
task.arguments = arguments
|
||||||
|
|
||||||
let pipe = Pipe()
|
let pipe = Pipe()
|
||||||
task.standardOutput = pipe
|
task.standardOutput = pipe
|
||||||
|
|
||||||
|
if withStandardError {
|
||||||
|
task.standardError = pipe
|
||||||
|
}
|
||||||
|
|
||||||
task.launch()
|
task.launch()
|
||||||
|
|
||||||
let data = pipe.fileHandleForReading.readDataToEndOfFile()
|
let data = pipe.fileHandleForReading.readDataToEndOfFile()
|
||||||
@ -30,4 +40,17 @@ public class RealCommand: CommandProtocol {
|
|||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func execute(
|
||||||
|
path: String,
|
||||||
|
arguments: [String],
|
||||||
|
trimNewlines: Bool = false
|
||||||
|
) -> String {
|
||||||
|
self.execute(
|
||||||
|
path: path,
|
||||||
|
arguments: arguments,
|
||||||
|
trimNewlines: trimNewlines,
|
||||||
|
withStandardError: false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,37 +12,46 @@ class Actions {
|
|||||||
|
|
||||||
// MARK: - Services
|
// MARK: - Services
|
||||||
|
|
||||||
|
public static func linkPhp() async {
|
||||||
|
await brew("link php --overwrite --force")
|
||||||
|
}
|
||||||
|
|
||||||
public static func restartPhpFpm() async {
|
public static func restartPhpFpm() async {
|
||||||
await brew("services restart \(Homebrew.Formulae.php)", sudo: Homebrew.Formulae.php.elevated)
|
await brew("services restart \(HomebrewFormulae.php)", sudo: HomebrewFormulae.php.elevated)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func restartPhpFpm(version: String) async {
|
||||||
|
let formula = (version == PhpEnvironments.brewPhpAlias) ? "php" : "php@\(version)"
|
||||||
|
await brew("services restart \(formula)", sudo: HomebrewFormulae.php.elevated)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func restartNginx() async {
|
public static func restartNginx() async {
|
||||||
await brew("services restart \(Homebrew.Formulae.nginx)", sudo: Homebrew.Formulae.nginx.elevated)
|
await brew("services restart \(HomebrewFormulae.nginx)", sudo: HomebrewFormulae.nginx.elevated)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func restartDnsMasq() async {
|
public static func restartDnsMasq() async {
|
||||||
await brew("services restart \(Homebrew.Formulae.dnsmasq)", sudo: Homebrew.Formulae.dnsmasq.elevated)
|
await brew("services restart \(HomebrewFormulae.dnsmasq)", sudo: HomebrewFormulae.dnsmasq.elevated)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func stopValetServices() async {
|
public static func stopValetServices() async {
|
||||||
await brew("services stop \(Homebrew.Formulae.php)", sudo: Homebrew.Formulae.php.elevated)
|
await brew("services stop \(HomebrewFormulae.php)", sudo: HomebrewFormulae.php.elevated)
|
||||||
await brew("services stop \(Homebrew.Formulae.nginx)", sudo: Homebrew.Formulae.nginx.elevated)
|
await brew("services stop \(HomebrewFormulae.nginx)", sudo: HomebrewFormulae.nginx.elevated)
|
||||||
await brew("services stop \(Homebrew.Formulae.dnsmasq)", sudo: Homebrew.Formulae.dnsmasq.elevated)
|
await brew("services stop \(HomebrewFormulae.dnsmasq)", sudo: HomebrewFormulae.dnsmasq.elevated)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func fixHomebrewPermissions() throws {
|
public static func fixHomebrewPermissions() throws {
|
||||||
var servicesCommands = [
|
var servicesCommands = [
|
||||||
"\(Paths.brew) services stop \(Homebrew.Formulae.nginx)",
|
"\(Paths.brew) services stop \(HomebrewFormulae.nginx)",
|
||||||
"\(Paths.brew) services stop \(Homebrew.Formulae.dnsmasq)"
|
"\(Paths.brew) services stop \(HomebrewFormulae.dnsmasq)"
|
||||||
]
|
]
|
||||||
|
|
||||||
var cellarCommands = [
|
var cellarCommands = [
|
||||||
"chown -R \(Paths.whoami):admin \(Paths.cellarPath)/\(Homebrew.Formulae.nginx)",
|
"chown -R \(Paths.whoami):admin \(Paths.cellarPath)/\(HomebrewFormulae.nginx)",
|
||||||
"chown -R \(Paths.whoami):admin \(Paths.cellarPath)/\(Homebrew.Formulae.dnsmasq)"
|
"chown -R \(Paths.whoami):admin \(Paths.cellarPath)/\(HomebrewFormulae.dnsmasq)"
|
||||||
]
|
]
|
||||||
|
|
||||||
PhpEnv.shared.availablePhpVersions.forEach { version in
|
PhpEnvironments.shared.availablePhpVersions.forEach { version in
|
||||||
let formula = version == PhpEnv.brewPhpAlias
|
let formula = version == PhpEnvironments.brewPhpAlias
|
||||||
? "php"
|
? "php"
|
||||||
: "php@\(version)"
|
: "php@\(version)"
|
||||||
servicesCommands.append("\(Paths.brew) services stop \(formula)")
|
servicesCommands.append("\(Paths.brew) services stop \(formula)")
|
||||||
@ -119,9 +128,9 @@ class Actions {
|
|||||||
extensions and/or run `composer global update`.
|
extensions and/or run `composer global update`.
|
||||||
*/
|
*/
|
||||||
public static func fixMyValet() async {
|
public static func fixMyValet() async {
|
||||||
await InternalSwitcher().performSwitch(to: PhpEnv.brewPhpAlias)
|
await InternalSwitcher().performSwitch(to: PhpEnvironments.brewPhpAlias)
|
||||||
await brew("services restart \(Homebrew.Formulae.dnsmasq)", sudo: Homebrew.Formulae.dnsmasq.elevated)
|
await brew("services restart \(HomebrewFormulae.dnsmasq)", sudo: HomebrewFormulae.dnsmasq.elevated)
|
||||||
await brew("services restart \(Homebrew.Formulae.php)", sudo: Homebrew.Formulae.php.elevated)
|
await brew("services restart \(HomebrewFormulae.php)", sudo: HomebrewFormulae.php.elevated)
|
||||||
await brew("services restart \(Homebrew.Formulae.nginx)", sudo: Homebrew.Formulae.nginx.elevated)
|
await brew("services restart \(HomebrewFormulae.nginx)", sudo: HomebrewFormulae.nginx.elevated)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,64 @@ struct Constants {
|
|||||||
*/
|
*/
|
||||||
static let MinimumRecommendedValetVersion = "2.16.2"
|
static let MinimumRecommendedValetVersion = "2.16.2"
|
||||||
|
|
||||||
|
/**
|
||||||
|
The amount of seconds that is considered the threshold for
|
||||||
|
PHP Monitor to mark any given launch as a "slow" launch.
|
||||||
|
|
||||||
|
If the startup procedure was slow (or hangs), this message should
|
||||||
|
be displayed. This is based on an appropriate launch time on a
|
||||||
|
basic M1 Apple chip, with some margin for slower Intel chips.
|
||||||
|
*/
|
||||||
|
static let SlowBootThresholdInterval: TimeInterval = 30.0
|
||||||
|
|
||||||
|
/**
|
||||||
|
PHP Monitor supplies a hardcoded list of PHP packages in its own
|
||||||
|
PHP Version Manager.
|
||||||
|
|
||||||
|
This hardcoded list will expire and will need to be modified when
|
||||||
|
the cutoff date occurs, which is when the `php` formula will
|
||||||
|
become PHP 8.5, and a new build will need to be made.
|
||||||
|
|
||||||
|
If users launch an older version of the app, then a warning
|
||||||
|
will be displayed to let them know that certain operations
|
||||||
|
will not work correctly and that they need to update their app.
|
||||||
|
*/
|
||||||
|
static let PhpFormulaeCutoffDate = "2025-11-30" // YYYY-MM-DD
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The PHP versions that are considered pre-release versions.
|
||||||
|
* Past a certain date, an experimental version "graduates"
|
||||||
|
* to a release version and is no longer marked as experimental.
|
||||||
|
*/
|
||||||
|
static var ExperimentalPhpVersions: Set<String> {
|
||||||
|
let releaseDates = [
|
||||||
|
"8.5": Date.fromString(Self.PhpFormulaeCutoffDate),
|
||||||
|
"8.4": Date.fromString("2024-11-22")
|
||||||
|
]
|
||||||
|
|
||||||
|
return Set(releaseDates
|
||||||
|
.filter { (_: String, date: Date?) in
|
||||||
|
guard let date else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return date > Date.now
|
||||||
|
}.map { (version: String, _: Date?) in
|
||||||
|
return version
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
The Homebrew services that should be automatically
|
||||||
|
detected and show up in the list of managed services.
|
||||||
|
*/
|
||||||
|
static let DetectedHomebrewServices: Set = [
|
||||||
|
"mailhog",
|
||||||
|
"mysql@",
|
||||||
|
"postgresql@",
|
||||||
|
"redis"
|
||||||
|
]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The PHP versions supported by this application.
|
* The PHP versions supported by this application.
|
||||||
* Any other PHP versions are considered invalid.
|
* Any other PHP versions are considered invalid.
|
||||||
@ -25,7 +83,8 @@ struct Constants {
|
|||||||
static let DetectedPhpVersions: Set = [
|
static let DetectedPhpVersions: Set = [
|
||||||
"5.6",
|
"5.6",
|
||||||
"7.0", "7.1", "7.2", "7.3", "7.4",
|
"7.0", "7.1", "7.2", "7.3", "7.4",
|
||||||
"8.0", "8.1", "8.2", "8.3"
|
"8.0", "8.1", "8.2", "8.3", "8.4",
|
||||||
|
"8.5" // DEV
|
||||||
]
|
]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,14 +100,13 @@ struct Constants {
|
|||||||
3: // Valet v3 dropped support for v5.6
|
3: // Valet v3 dropped support for v5.6
|
||||||
[
|
[
|
||||||
"7.0", "7.1", "7.2", "7.3", "7.4",
|
"7.0", "7.1", "7.2", "7.3", "7.4",
|
||||||
"8.0", "8.1", "8.2",
|
"8.0", "8.1", "8.2", "8.3", "8.4"
|
||||||
"8.3" // dev
|
|
||||||
],
|
],
|
||||||
4: // Valet v4 dropped support for v7.0
|
4: // Valet v4 dropped support for v7.0
|
||||||
[
|
[
|
||||||
"7.1", "7.2", "7.3", "7.4",
|
"7.1", "7.2", "7.3", "7.4",
|
||||||
"8.0", "8.1", "8.2",
|
"8.0", "8.1", "8.2", "8.3", "8.4",
|
||||||
"8.3" // dev
|
"8.5" // DEV
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -64,6 +122,14 @@ struct Constants {
|
|||||||
string: "https://phpmon.app/faq"
|
string: "https://phpmon.app/faq"
|
||||||
)!
|
)!
|
||||||
|
|
||||||
|
static let WikiPhpUnavailable = URL(
|
||||||
|
string: "https://phpmon.app/php-unavailable"
|
||||||
|
)!
|
||||||
|
|
||||||
|
static let WikiPhpUpgrade = URL(
|
||||||
|
string: "https://phpmon.app/php-upgrade"
|
||||||
|
)!
|
||||||
|
|
||||||
static let DonationPayment = URL(
|
static let DonationPayment = URL(
|
||||||
string: "https://phpmon.app/sponsor/now"
|
string: "https://phpmon.app/sponsor/now"
|
||||||
)!
|
)!
|
||||||
@ -82,6 +148,16 @@ struct Constants {
|
|||||||
string: "https://raw.githubusercontent.com/nicoverbruggen/homebrew-cask/master/Casks/phpmon-dev.rb"
|
string: "https://raw.githubusercontent.com/nicoverbruggen/homebrew-cask/master/Casks/phpmon-dev.rb"
|
||||||
)!
|
)!
|
||||||
|
|
||||||
|
// EAP URLs
|
||||||
|
|
||||||
|
static let EarlyAccessCaskFile = URL(
|
||||||
|
string: "https://phpmon.app/builds/early-access/sponsors/phpmon-eap.rb"
|
||||||
|
)!
|
||||||
|
|
||||||
|
static let EarlyAccessChangelog = URL(
|
||||||
|
string: "https://phpmon.app/early-access/release-notes"
|
||||||
|
)!
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,6 @@
|
|||||||
|
|
||||||
// MARK: Common Shell Commands
|
// MARK: Common Shell Commands
|
||||||
|
|
||||||
/**
|
|
||||||
Runs a `valet` command. Defaults to running as superuser.
|
|
||||||
*/
|
|
||||||
func valet(_ command: String, sudo: Bool = true) async -> String {
|
|
||||||
return await Shell.pipe("\(sudo ? "sudo " : "")" + "\(Paths.valet) \(command)").out
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Runs a `brew` command. Can run as superuser.
|
Runs a `brew` command. Can run as superuser.
|
||||||
*/
|
*/
|
||||||
@ -52,7 +45,6 @@ func grepContains(file: String, query: String) async -> Bool {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Attempts to introduce sleep for a particular duration. Use with caution.
|
Attempts to introduce sleep for a particular duration. Use with caution.
|
||||||
Only intended for testing purposes.
|
|
||||||
*/
|
*/
|
||||||
func delay(seconds: Double) async {
|
func delay(seconds: Double) async {
|
||||||
try! await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
|
try! await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
|
||||||
|
@ -8,24 +8,21 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class Homebrew {
|
struct HomebrewFormulae {
|
||||||
static var fake: Bool = false
|
|
||||||
|
|
||||||
struct Formulae {
|
|
||||||
static var php: HomebrewFormula {
|
static var php: HomebrewFormula {
|
||||||
if Homebrew.fake {
|
if PhpEnvironments.shared.homebrewPackage == nil {
|
||||||
return HomebrewFormula("php", elevated: true)
|
return HomebrewFormula("php", elevated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
if PhpEnv.shared.homebrewPackage == nil {
|
guard let install = PhpEnvironments.phpInstall else {
|
||||||
fatalError("You must either load the HomebrewPackage object or call `fake` on the Homebrew class.")
|
return HomebrewFormula("php", elevated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
return HomebrewFormula(PhpEnv.phpInstall.formula, elevated: true)
|
return HomebrewFormula(install.formula, elevated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
static var nginx: HomebrewFormula {
|
static var nginx: HomebrewFormula {
|
||||||
return HomebrewDiagnostics.usesNginxFullFormula
|
return BrewDiagnostics.usesNginxFullFormula
|
||||||
? HomebrewFormula("nginx-full", elevated: true)
|
? HomebrewFormula("nginx-full", elevated: true)
|
||||||
: HomebrewFormula("nginx", elevated: true)
|
: HomebrewFormula("nginx", elevated: true)
|
||||||
}
|
}
|
||||||
@ -34,7 +31,6 @@ class Homebrew {
|
|||||||
return HomebrewFormula("dnsmasq", elevated: true)
|
return HomebrewFormula("dnsmasq", elevated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
class HomebrewFormula: Equatable, Hashable, CustomStringConvertible {
|
class HomebrewFormula: Equatable, Hashable, CustomStringConvertible {
|
||||||
let name: String
|
let name: String
|
||||||
|
@ -13,6 +13,7 @@ class Log {
|
|||||||
static var shared = Log()
|
static var shared = Log()
|
||||||
|
|
||||||
var logFilePath = "~/.config/phpmon/last_session.log"
|
var logFilePath = "~/.config/phpmon/last_session.log"
|
||||||
|
|
||||||
var logExists = false
|
var logExists = false
|
||||||
|
|
||||||
enum Verbosity: Int {
|
enum Verbosity: Int {
|
||||||
@ -29,9 +30,9 @@ class Log {
|
|||||||
|
|
||||||
public func prepareLogFile() {
|
public func prepareLogFile() {
|
||||||
if !isRunningTests && Verbosity.cli.isApplicable() {
|
if !isRunningTests && Verbosity.cli.isApplicable() {
|
||||||
_ = system("mkdir -p ~/.config/phpmon 2> /dev/null")
|
system_quiet("mkdir -p ~/.config/phpmon 2> /dev/null")
|
||||||
_ = system("rm ~/.config/phpmon/last_session.log 2> /dev/null")
|
system_quiet("rm ~/.config/phpmon/last_session.log 2> /dev/null")
|
||||||
_ = system("touch ~/.config/phpmon/last_session.log 2> /dev/null")
|
system_quiet("touch ~/.config/phpmon/last_session.log 2> /dev/null")
|
||||||
self.logExists = FileSystem.fileExists(self.logFilePath)
|
self.logExists = FileSystem.fileExists(self.logFilePath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,6 +73,12 @@ class Log {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func line(as verbosity: Verbosity = .info) {
|
||||||
|
if verbosity.isApplicable() {
|
||||||
|
Log.shared.log("----------------------------------")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func log(_ text: String) {
|
private func log(_ text: String) {
|
||||||
print(text)
|
print(text)
|
||||||
|
|
||||||
|
@ -17,11 +17,27 @@ public class Paths {
|
|||||||
|
|
||||||
internal var baseDir: Paths.HomebrewDir
|
internal var baseDir: Paths.HomebrewDir
|
||||||
private var userName: String
|
private var userName: String
|
||||||
|
private var preferredShell: String
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
// Assume the default directory is correct
|
||||||
baseDir = App.architecture != "x86_64" ? .opt : .usr
|
baseDir = App.architecture != "x86_64" ? .opt : .usr
|
||||||
|
|
||||||
|
// Ensure that if a different location is used, it takes precendence
|
||||||
|
if baseDir == .usr
|
||||||
|
&& FileSystem.directoryExists("/usr/local/homebrew")
|
||||||
|
&& !FileSystem.directoryExists("/usr/local/Cellar") {
|
||||||
|
Log.warn("Using /usr/local/homebrew as base directory!")
|
||||||
|
baseDir = .usr_hb
|
||||||
|
}
|
||||||
|
|
||||||
userName = identity()
|
userName = identity()
|
||||||
Log.info("[ID] The current username is `\(userName)`.")
|
preferredShell = preferred_shell()
|
||||||
|
|
||||||
|
if !isRunningSwiftUIPreview {
|
||||||
|
Log.info("The current username is `\(userName)`.")
|
||||||
|
Log.info("The user's shell is `\(preferredShell)`.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func detectBinaryPaths() {
|
public func detectBinaryPaths() {
|
||||||
@ -86,6 +102,23 @@ public class Paths {
|
|||||||
return "\(shared.baseDir.rawValue)/etc"
|
return "\(shared.baseDir.rawValue)/etc"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static var tapPath: String {
|
||||||
|
if shared.baseDir == .usr {
|
||||||
|
return "\(shared.baseDir.rawValue)/homebrew/Library/Taps"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "\(shared.baseDir.rawValue)/Library/Taps"
|
||||||
|
}
|
||||||
|
|
||||||
|
public static var caskroomPath: String {
|
||||||
|
return "\(shared.baseDir.rawValue)/Caskroom/"
|
||||||
|
+ (App.identifier.contains(".dev") ? "phpmon-dev" : "phpmon")
|
||||||
|
}
|
||||||
|
|
||||||
|
public static var shell: String {
|
||||||
|
return shared.preferredShell
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Flexible Binaries
|
// MARK: - Flexible Binaries
|
||||||
// (these can be in multiple locations, so we scan common places because)
|
// (these can be in multiple locations, so we scan common places because)
|
||||||
// (PHP Monitor will not use the user's own PATH)
|
// (PHP Monitor will not use the user's own PATH)
|
||||||
@ -95,6 +128,8 @@ public class Paths {
|
|||||||
Paths.composer = "/usr/local/bin/composer"
|
Paths.composer = "/usr/local/bin/composer"
|
||||||
} else if FileSystem.fileExists("/opt/homebrew/bin/composer") {
|
} else if FileSystem.fileExists("/opt/homebrew/bin/composer") {
|
||||||
Paths.composer = "/opt/homebrew/bin/composer"
|
Paths.composer = "/opt/homebrew/bin/composer"
|
||||||
|
} else if FileSystem.fileExists("/usr/local/homebrew/bin/composer") {
|
||||||
|
Paths.composer = "/usr/local/homebrew/bin/composer"
|
||||||
} else {
|
} else {
|
||||||
Paths.composer = nil
|
Paths.composer = nil
|
||||||
Log.warn("Composer was not found.")
|
Log.warn("Composer was not found.")
|
||||||
@ -106,6 +141,7 @@ public class Paths {
|
|||||||
public enum HomebrewDir: String {
|
public enum HomebrewDir: String {
|
||||||
case opt = "/opt/homebrew"
|
case opt = "/opt/homebrew"
|
||||||
case usr = "/usr/local"
|
case usr = "/usr/local"
|
||||||
|
case usr_hb = "/usr/local/homebrew"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|