With increased exposure of built in compression routines, it's now feasible to write fairly succinct functions that can ZIP/UNZIP (see also Does Ren-C have zip and unzip?).
As always, rather than introduce new functions that would be complex in nature and PHPish in proliferation, I would see a ZIP scheme as the preferred way to interface with ZIP assets.
Implementation Sketches
Here's some thoughts for how this might work:
; Opening
archive: open zip:///Users/Chris/Archive.zip ; short form maps to filesystem
archive: open [
scheme: 'zip
source: %/Users/Chris/Archive.zip
]
archive: open [
scheme: 'zip ; new empty archive
source: #{}
]
archive: open [
scheme: 'zip ; remote archive
source: s3://a-bucket/archive.zip
]
; Extracting
select archive %path/to/file.reb
select archive [from folder %path/to/] ; dialect for selecting multiple contained assets
first next archive ; port offers a series API to access contained assets
; Modifying
append archive [%path/to/new.reb {Rebol []}]
remove archive ; removes an asset per the series API
; Saving
close archive ; updates using existing reference
close rename archive %/Users/Chris/Archive-Copy.zip
copy archive ; returns binary copy of archive
Thoughts, critiques, suggestions, etc...